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

标签 python numpy

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

相关文章:

python - 自定义/删除 Django 选择框空白选项

Python 中整数列表与字符串结果的不同之处

python - 将函数的输出传递给 django 过滤器

python - 如何使用 Python 图像库将任何图像转换为 4 色调色板图像?

python - 在 numpy 中从单个 block 创建 block 矩阵的更好方法?

python - MATLAB在NumPy/Python中的流畅实现(n点移动平均)

python - 我想解析一个大的 csv 文件并将其上传到 mysql 数据库中,但它需要很长时间。 Python/Django

Python 多处理比单处理花费更长的时间

python - 为 Sublime Text 3 安装 numpy

python - 如何将整数类型数组(带有一些NaN)转换为字符串类型数组