X[mask1, mask2]described in the Boolean Array Indexing Doc as equivalent
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])
Essentially, it gives you X[0,0]and X[1,1](matching 0s and 1s).
Instead, you want:
In [251]: X[[[0],[1]], [0,1]]
Out[251]:
array([[1, 2],
[4, 5]])
np.ix_ - a handy tool for creating the right combination of sizes
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])]