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

时间:2016-01-19 12:51:09

标签: python arrays numpy indexing 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))

现在,当我进入:

two_d[first, second]

我明白了:

array([3,9])

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

2 个答案:

答案 0 :(得分:9)

当给定多个布尔数组进行索引时,NumPy将True值的索引配对。 first中的第一个真值与second中的第一个真值配对,依此类推。 NumPy然后在每个(x,y)索引处获取元素。

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

two_d[[0, 1], [3, 4]]

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

documents on advanced indexing简要提及此行为,并建议np.ix_作为“不太令人惊讶”的替代方案:

  

使用obj.nonzero()类比可以最好地理解将多个布尔索引数组或布尔与整数索引数组合在一起。函数ix_也支持布尔数组,并且可以毫无意外地工作。

因此您可能正在寻找:

>>> two_d[np.ix_(first, second)]
array([[3, 4],
       [8, 9]])

答案 1 :(得分:2)

检查documentation on boolean indexing

two_d[first, second]与<two_d[first.nonzero(), second.nonzero()]相同,其中:

>>> first.nonzero()
(array([0, 1]),)
>>> second.nonzero()
(array([3, 4]),)

用作索引,这将选择3和9,因为

>>> two_d[0,3]
3
>>> two_d[1,4]
9

>>> two_d[[0,1],[3,4]]
array([3, 9])

同样温和相关:NumPy indexing using List?