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

Unexpected behaviour when indexing a 2D np.array with two boolean arrays

提问人:Ted 提问时间:1/19/2016 最后编辑:Alex RileyTed 更新时间:1/19/2016 访问量:458

问:

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])

这对我来说没有多大意义。谁能简单地解释一下?

阵 列 麻木 索引

评论


答:

13赞 Alex Riley 1/19/2016 #1

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

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

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

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

关于高级索引的文档简要地提到了这种行为,并建议作为一种“不那么令人惊讶”的替代方案:np.ix_

将多个布尔索引数组或布尔值与整数索引数组组合在一起,可以通过类比来最好地理解。该函数还支持布尔数组,并且不会出现任何意外。obj.nonzero()ix_

因此,您可能正在寻找:

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

评论

0赞 pixelbrei 1/19/2016
要获得我认为您想要获得的内容,您可以使用 two_d[first]。T[秒]。T
3赞 timgeb 1/19/2016 #2

查看有关布尔索引的文档

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])

也与温和相关:使用 List 进行 NumPy 索引?