我想掩盖多维数组,例如形状为A
x N
x N
x N
的4D数组N
最后三个维度使用不同的掩码(a
,b
和c
)。因此a
,b
和c
是向量,其值True
和False
的长度为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,)
答案 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]]]])