使用两个布尔数组索引2D np.array时出现意外行为

Tom*_*Tom 11 python arrays indexing numpy slice

two_d = np.array([[ 0,  1,  2,  3,  4],
                  [ 5,  6,  7,  8,  9],
                  [10, 11, 12, 13, 14],
                  [15, 16, 17, 18, 19],
                  [20, 21, 22, 23, 24]])

first = np.array((True, True, False, False, False))
second = np.array((False, False, False, True, True))
Run Code Online (Sandbox Code Playgroud)

现在,当我进入:

two_d[first, second]
Run Code Online (Sandbox Code Playgroud)

我明白了:

array([3,9])
Run Code Online (Sandbox Code Playgroud)

这对我来说并没有多大意义.有人可以解释一下吗?

Ale*_*ley 9

当给定多个布尔数组来索引时,NumPy将True值的索引配对.在第一个真正的价值first在与第一个真正的价值配对second,等等.然后NumPy在每个(x,y)索引处获取元素.

这意味着two_d[first, second]相当于:

two_d[[0, 1], [3, 4]]
Run Code Online (Sandbox Code Playgroud)

换句话说,您正在检索索引(0,3)和索引(1,4)的值; 39.请注意,如果两个数组具有不同数量的真值,则会引发错误!

有关高级索引文档简要提及了此行为,并建议将其np.ix_作为"不太令人惊讶"的替代方案:

通过obj.nonzero()类比可以最好地理解组合多个布尔索引数组或布尔与整数索引数组.该函数ix_还支持布尔数组,并且可以毫无意外地工作.

因此,您可能正在寻找:

>>> two_d[np.ix_(first, second)]
array([[3, 4],
       [8, 9]])
Run Code Online (Sandbox Code Playgroud)