gpt4 book ai didi

python - 使用 numpy 在多个轴上进行 bool 掩码

转载 作者:太空狗 更新时间:2023-10-30 00:05:26 25 4
gpt4 key购买 nike

我想对行和列应用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com