提问人:Ted 提问时间:1/19/2016 最后编辑:Alex RileyTed 更新时间:1/19/2016 访问量:458
使用两个布尔数组索引 2D np.array 时出现意外行为
Unexpected behaviour when indexing a 2D np.array with two boolean arrays
问:
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) 索引处获取元素。first
second
这意味着这相当于:two_d[first, second]
two_d[[0, 1], [3, 4]]
换言之,您正在检索索引 (0, 3) 和索引 (1, 4) 处的值; 和。请注意,如果两个数组具有不同数量的真值,则会引发错误!3
9
关于高级索引的文档简要地提到了这种行为,并建议作为一种“不那么令人惊讶”的替代方案: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 索引?
评论