我想对行和列应用 bool 掩码。
与
X = np.array([[1,2,3],[4,5,6]])
mask1 = np.array([True, True])
mask2 = np.array([True, True, False])
X[mask1, mask2]
我希望输出是
array([[1,2],[4,5]])
代替
array([1,5])
众所周知
X[:, mask2]
可以在这里使用,但这不是一般情况下的解决方案。
我想知道它是如何工作的,以及为什么在这种情况下结果是 array([1,5])
。
最佳答案
X[mask1, mask2]
在 Boolean Array Indexing Doc 中描述相当于
In [249]: X[mask1.nonzero()[0], mask2.nonzero()[0]]
Out[249]: array([1, 5])
In [250]: X[[0,1], [0,1]]
Out[250]: array([1, 5])
实际上,它为您提供了 X[0,0]
和 X[1,1]
(将 0 和 1 配对)。
你想要的是:
In [251]: X[[[0],[1]], [0,1]]
Out[251]:
array([[1, 2],
[4, 5]])
np.ix_
是创建正确维度组合的便捷工具
In [258]: np.ix_([0,1],[0,1])
Out[258]:
(array([[0],
[1]]), array([[0, 1]]))
In [259]: X[np.ix_([0,1],[0,1])]
Out[259]:
array([[1, 2],
[4, 5]])
这实际上是第一个轴的列向量和第二个轴的行向量,它们共同定义了所需的矩形值。
但是尝试像这样广播 bool 数组是行不通的:X[mask1[:,None], mask2]
但是那个引用部分说:
Combining multiple Boolean indexing arrays or a Boolean with an integer indexing array can best be understood with the obj.nonzero() analogy. The function ix_ also supports boolean arrays and will work without any surprises.
In [260]: X[np.ix_(mask1, mask2)]
Out[260]:
array([[1, 2],
[4, 5]])
In [261]: np.ix_(mask1, mask2)
Out[261]:
(array([[0],
[1]], dtype=int32), array([[0, 1]], dtype=int32))
ix_
的 bool 部分:
if issubdtype(new.dtype, _nx.bool_):
new, = new.nonzero()
因此它适用于像 X[np.ix_(mask1, [0,2])]
关于python - 使用 numpy 在多个轴上进行 bool 掩码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42309460/