遮罩多维NumPy数组

时间:2018-10-09 12:33:58

标签: python arrays numpy numpy-ndarray

我想掩盖多维数组,例如形状为A x N x N x N的4D数组N最后三个维度使用不同的掩码(abc)。因此abc是向量,其值TrueFalse的长度为N。尝试将A屏蔽为A[:,a,b,c]会产生一个异常(这是怎么做的?),A[:,:,:,d][:,:,c][:,b]可以正常工作, 但会产生不必要的中间体。如果我对每个维度都有掩码,则可以将它们用作A[numpy.ix_(a, b, c, d)]来创建中间索引数组,但是我不想创建到处都是a的伪掩码True。谢谢。

编辑:

import numpy as np

A = np.arange(3**4).reshape((3,3,3,3))
a = np.asarray([True, True, True])
b = np.asarray([False, False, True])
c = np.asarray([True, True, False])

B = A[:,:,:,c][:,:,b][:,a]
print(B)

B2 = A[:,a,b,c]
print(B2)

输出:

[[[[ 6  7]]

  [[15 16]]

  [[24 25]]]


 [[[33 34]]

  [[42 43]]

  [[51 52]]]


 [[[60 61]]

  [[69 70]]

  [[78 79]]]]
Traceback (most recent call last):
  File "test2.py", line 11, in <module>
    B2 = A[:,a,b,c]
IndexError: shape mismatch: indexing arrays could not be broadcast 
together with shapes (3,) (1,) (2,)

1 个答案:

答案 0 :(得分:0)

您可以使用转置技巧来实现:

In [19]: (A.T[np.ix_(c.T, b.T, a.T)]).T
Out[19]:
array([[[[ 6,  7]],

    [[15, 16]],

    [[24, 25]]],


   [[[33, 34]],

    [[42, 43]],

    [[51, 52]]],


   [[[60, 61]],

    [[69, 70]],

    [[78, 79]]]])