如何以向量化方式numpy多次索引多维数组?

rhingo3

我正在尝试在numpy中索引多维数组(4维)。阵列的形状为(125,125,125,3)。我有3个单独的2D索引数组列表。列表的大小分别为(N,4),(M,4)和(1,4)。3个单独的列表表示我要索引的4D数组中的行,列和深度值。例如,考虑以下内容:

ix = [[0,1,2,3],
     [3,4,5,6]]
iy = [[2,3,4,5],
     [5,6,7,8]]
iz = [[1,2,3,4]]

weights.shape = (125,125,125,3)

我想指数weights与行,列和深度指数阵列中每一个可能的组合ixiyiz例如,如果我采取的第一个行中的每个索引的矩阵,这意味着我想选择的行[0,1,2,3],列[2,3,4,5],和深度值[1,2,3,4]weights我一直想选择的第4维的所有元素weights这意味着我实际上是在选择(4,4,4,3)的一部分weights

现在,我已经通过使用以下代码对循环进行索引来实现此目的

w = np.empty(shape=(X,Y,Z,4,4,4,weights.ndim-1))
for i in range(X):
    for j in range(Y):
        w_ij = np.ix_(ix[i,:], iy[j,:], iz[0,:])
        w[i,j,0,:,:,:,:] = weights[w_ij[0], w_ij[1], w_ij[2], :]

我的最终目标是尽快构建w形状为(N,M,1,4,4,4,4,3)的多维数组这部分代码将要运行多次,因此,如果有使用内置numpy函数的矢量化方法,那将是理想的选择。

如果有任何澄清的问题,请告诉我。这是我第一次问堆栈溢出问题,因此,如果有任何不清楚或令人困惑的地方,我深表歉意!

阿南达

您可以将索引与广播配合使用来实现此目的。

import numpy as np

weights = np.random.rand(125, 125, 125, 3)

ix = np.array([[0,1,2,3], [3,4,5,6]])
iy = np.array([[2,3,4,5], [5,6,7,8]])
iz = np.array([[1,2,3,4]])

X = len(ix)
Y = len(iy)
Z = len(iz)

def compute1(weights):
    w = np.empty(shape=(X, Y, Z, 4, 4, 4, weights.ndim-1))
    for i in range(X):
        for j in range(Y):
            w_ij = np.ix_(ix[i,:], iy[j,:], iz[0,:])
            w[i,j,0,:,:,:,:] = weights[w_ij[0], w_ij[1], w_ij[2], :]
    return w

def compute2(weights):
    return weights[ix[:, None, None, :, None, None], iy[None, :, None, None, :, None], iz[None, None, :, None, None, :]]

print(np.allclose(compute1(weights), compute2(weights)))

True

基准测试-

%timeit compute1(weights)
%timeit compute2(weights)

给-

36.7 µs ± 897 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
6.28 µs ± 62.8 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

如您所见,对于这种大小的数据,广播解决​​方案的速度提高了约6倍。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何以相反的顺序获取numpy多维数组的索引?

来自分类Dev

如何找到向量化矩阵numpy的索引

来自分类Dev

向量化数组索引

来自分类Dev

numpy向量化多维函数

来自分类Dev

向量化从具有索引列表的多维数组中提取子多维数组

来自分类Dev

如何以向量化形式编写此numpy代码?

来自分类Dev

NumPy:在向量化分配期间求出索引数组

来自分类Dev

Numpy向量化循环遍历数组索引

来自分类Dev

numpy数组的向量化操作

来自分类Dev

向量化numpy数组扩展

来自分类Dev

numpy多维数组索引

来自分类Dev

如何以自定义方式对多维数组进行排序

来自分类Dev

以向量化方式查找不同元素的索引

来自分类Dev

如何向量化3D Numpy数组

来自分类Dev

在Numpy中对多维数组中的点集进行向量化查找

来自分类Dev

如何向量化多维矩阵的 Softmax 概率

来自分类Dev

在Matlab中向量化数组索引/子集

来自分类Dev

使用索引数组索引多维 numpy 数组

来自分类Dev

numpy数组中的多维索引

来自分类Dev

numpy向量化数组的最大值

来自分类Dev

在numpy数组上向量化python循环

来自分类Dev

使用numpy数组向量化函数

来自分类Dev

Numpy数组上的向量化计算

来自分类Dev

numpy向量化数组的最大值

来自分类Dev

向量化计数 2 维 Numpy 数组

来自分类Dev

如何使用NumPY向量化缩小函数?

来自分类Dev

如何沿着多维数组的关联索引向子数组的每个元素添加向量元素

来自分类Dev

如何在python中向量化数组

来自分类Dev

如何使用if语句向量化在numpy数组中查找最大值?