繁体   English   中英

使用索引数组中的索引元组索引多维数组 - NumPy / Python

[英]Indexing multi-dimensional array with tuple of indices from an indexing array - NumPy / Python

我有一个尺寸为(6,m,n)的 3-D numpy 数组a 我还有一个尺寸为(20,20,20,20,20,20)的 6 (20,20,20,20,20,20) numpy 数组b ,可以有效地用作掩码。

我想使用第一个数组中每个位置(m,n)的 6 个值来检索第二个数组中的相应值。 实际上,我会将 3D int 数组压缩为 2D 布尔数组。 我认为解决方案将使用np.where ,但我认为它不能处理使用值作为索引。

对此的幼稚实现将类似于:

for i in range(m):
    for j in range(n):
         new_arr[i,j]=b[tuple(a[:,i,j])]

有没有办法在不使用循环的情况下实现这一点?

方法#1

a重塑为2D保持第一个轴的长度相同。 将每个这样的 2D-flattened-block 转换为一个元组,然后索引到b 这种元组转换导致沿第一个轴打包每个元素作为索引器来选择每个元素b 最后需要重新整形以获得2D输出。 因此,实现看起来像这样 -

b[tuple(a.reshape(6,-1))].reshape(m,n)

或者,跳过所有那些重塑混乱的事情,简单地做——

b[tuple(a)]

这会创建相同的索引器并解决问题。

方法#2

或者,我们也可以计算扁平索引,然后用这些索引到扁平b并从中提取相关的布尔值 -

b.ravel()[np.ravel_multi_index(a,b.shape)]

大型数据集上的计时 -

In [89]: np.random.seed(0)
    ...: m,n = 500,500
    ...: b = np.random.rand(20,20,20,20,20,20)>0.5
    ...: a = np.random.randint(0,20,(6,m,n))

In [90]: %timeit b[tuple(a)]
14.6 ms ± 184 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

In [91]: %timeit b.ravel()[np.ravel_multi_index(a,b.shape)]
7.35 ms ± 136 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM