X[mask1, mask2]
描述于布尔数组索引文档 https://docs.scipy.org/doc/numpy/reference/arrays.indexing.html#boolean-array-indexing相当于
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]
and 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]])
这实际上是第一个轴的列向量和第二个轴的行向量,共同定义了所需的值矩形。
但是尝试像这样广播布尔数组是行不通的:X[mask1[:,None], mask2]
但该参考部分说:
将多个布尔索引数组或布尔值与整数索引数组组合可以通过 obj.nonzero() 类比来最好地理解。函数 ix_ 还支持布尔数组,并且可以毫无意外地工作。
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_
:
if issubdtype(new.dtype, _nx.bool_):
new, = new.nonzero()
所以它可以与像这样的混合一起使用X[np.ix_(mask1, [0,2])]