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])
这对我来说并没有多大意义。有人可以解释一下吗?
答案 0 :(得分:9)
当给定多个布尔数组进行索引时,NumPy将True值的索引配对。 first
中的第一个真值与second
中的第一个真值配对,依此类推。 NumPy然后在每个(x,y)索引处获取元素。
这意味着two_d[first, second]
相当于:
two_d[[0, 1], [3, 4]]
换句话说,您正在检索索引(0,3)和索引(1,4)的值; 3
和9
。请注意,如果两个数组具有不同数量的真值,则会引发错误!
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?