Python 布尔数组索引

Python 布尔数组索引,python,numpy,numpy-ndarray,numpy-slicing,Python,Numpy,Numpy Ndarray,Numpy Slicing,输出: a = np.arange(12).reshape(3,4) b1 = np.array([False,True,True] b2 = np.array([True,False,True,False]) a[b1,b2] 我不明白它是如何在[b1,b2]中出现4和10的显然你希望看到数组([[4,6],[8,10]]) 在布尔索引中,NumPy仅返回对角线元素,如下所述: 如果不使用np.ix_uuu调用,则只会选择对角线元素(…)。对于使用多个高级索引进行索引,这种差异是最重要

输出:

a = np.arange(12).reshape(3,4)

b1 = np.array([False,True,True]

b2 = np.array([True,False,True,False])

a[b1,b2]

我不明白它是如何在[b1,b2]中出现4和10的

显然你希望看到
数组([[4,6],[8,10]])

在布尔索引中,NumPy仅返回对角线元素,如下所述:

如果不使用
np.ix_uuu
调用,则只会选择对角线元素(…)。对于使用多个高级索引进行索引,这种差异是最重要的

对于所需的输出,请使用
np.ix()

首先,您已经安排了12个数组元素,它们以0开始,以1开始,以12结束。 然后用3行4列重塑数组元素的形状。 如下所示:

import numpy as np
a = np.arange(12).reshape(3, 4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
print(a)
print(a[b1, b2])
最后打印带有行和列的数组元素,因为数组是二维数组,它有行和列\ b1表示有三行的元素行,第一行(行[0])为False。 第二行(第[1]行)为True。。。。最后一行(第[2]行)为True。 b2还表示具有4列的数组的列。第一列(列[0])为真……第三列(列[2])为真。 最后一个是错误的。 然后,当我们想要返回二维数组的输出时,我们使用数组名(a[b1,b2]),b1和b2是行索引和列索引

第二行和第一列变为True。因此它返回4。其他的都是假的。第三行和第三列也变成了现实。因此,它返回10。其他的都是假的

这就是我所理解的。
对不起,我的英语不好。

正确的解释是。总之,

带有布尔数组的
a[b1,b2]
b2
相当于
a[b1.nonzero(),b2.nonzero()]

nonzero()
返回真值的索引。所以,

[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]

现在,我们用数组索引。与基于数组的索引一样,
[1,0]第
个元素是
4
[2,2]第
个元素是
10

如果有人有答案,我会很感兴趣。你能解释一下你期望得到什么以及为什么吗?我很难理解为什么
a[:,[True,True,True,True,True]
a[[True,True,True],:]
返回整个数组
a
但是
a[[True,True,True],[True,True,True]]
触发了一个广播错误。这里有一点我不明白。Numpy并不是简单地计算两个索引列表的外积,然后返回计算结果为
True的元素。
似乎也没有多大帮助。你是指
数组([[4,6],[8,10]]的对角线吗
?to@NachiketGokhale:是的,在这样的逻辑索引之后,numpy将返回该数组的对角线。如果返回的数组不是正方形怎么办?to@NachiketGokhale:原始
a[b1,b2]
表达式只有在b1和b2具有相等数量的
True
值时才定义。否则它将引发
索引器:形状不匹配
异常。因此,如果使用
a[np.ix_uub1,b2)]
表达式,这里只有对角数组才是可能的选择。请注意,与
a[b1,b2]
不同,
a[np.ix_b1,b2]
适用于任意数量的真值。虽然此链接可以回答问题,但最好在此处包含答案的基本部分,并提供链接以供参考。如果链接页面发生更改,则仅链接的答案可能无效-
import numpy as np
a = np.arange(12).reshape(3, 4)
b1 = np.array([False,True,True])
b2 = np.array([True,False,True,False])
print(a)
print(a[b1, b2])
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
b1.nonzero()=(array([1, 2]),)
b2.nonzero()=(array([0, 2]),)