遮罩一个多维NumPy数组

2024-05-13 20:41:01 发布

您现在位置:Python中文网/ 问答频道 /正文

我想屏蔽一个多维数组,比如4D数组A的形状NxNxNxN,其中我有一个不同的屏蔽(ab,和c)用于最后的三维。所以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,)

Tags: numpyfalsetruenp数组向量b2作品
1条回答
网友
1楼 · 发布于 2024-05-13 20:41:01

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

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]]]])

相关问题 更多 >