使用布尔数组进行索引
Indexing with Boolean arrays
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True]
b2 = np.array([True,False,True,False])
a[b1,b2]
输出:
array([4,10])
我不明白 a[b1,b2]
中的 4 和 10 是怎么来的
显然你希望看到 array([[ 4, 6],[ 8, 10]])
。
在布尔索引 NumPy 中 returns 只有描述的对角线元素 here:
without the np.ix_
call, only the diagonal elements would be selected(...). This difference is the most important thing to remember about indexing with multiple advanced indexes.
对于所需的输出使用 np.ix_()
:
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])
首先你排列了12个数组元素,从0开始,1步进,12结束。
然后你用 3 行和 4 列重塑了你的数组元素。
如下所示:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
然后最后打印带有行和列的数组元素,因为数组是一个二维数组,它有行和列。\
b1 表示具有三行且第一行 (row[0]) 为 False 的元素的行。
第二行 (row[1]) 为 True.... 最后一行 (row[2]) 为 True。
b2 也表示具有 4 列的数组的列。第一列(列[0])为真...第三列(列[2])为真。
最后一个是假的。
那么当我们想要return二维数组的输出时我们使用array name(a[b1, b2]),b1和b2分别是行索引和列索引。
第二行第一列变为True。因此它 returns 4. 其他都是假的。第三行和第三列也变为 True。所以,它returns 10。其他都是False。
我是这么理解的。
抱歉我的英语不好。
正确的解释是here。总结一下,
a[b1,b2]
与布尔数组 b1
和 b2
等同于 a[b1.nonzero(),b2.nonzero()]
.
nonzero()
returns 真值索引。因此,
b1.nonzero()=(array([1, 2]),)
b2.nonzero()=(array([0, 2]),)
所以,现在,我们正在使用数组进行索引。与基于数组的索引一样,返回 [1,0]th
元素 4
和 [2,2]th
元素 10
。
a = np.arange(12).reshape(3,4)
b1 = np.array([False,True,True]
b2 = np.array([True,False,True,False])
a[b1,b2]
输出:
array([4,10])
我不明白 a[b1,b2]
中的 4 和 10 是怎么来的显然你希望看到 array([[ 4, 6],[ 8, 10]])
。
在布尔索引 NumPy 中 returns 只有描述的对角线元素 here:
without the
np.ix_
call, only the diagonal elements would be selected(...). This difference is the most important thing to remember about indexing with multiple advanced indexes.
对于所需的输出使用 np.ix_()
:
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])
首先你排列了12个数组元素,从0开始,1步进,12结束。 然后你用 3 行和 4 列重塑了你的数组元素。 如下所示:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]]
然后最后打印带有行和列的数组元素,因为数组是一个二维数组,它有行和列。\ b1 表示具有三行且第一行 (row[0]) 为 False 的元素的行。 第二行 (row[1]) 为 True.... 最后一行 (row[2]) 为 True。 b2 也表示具有 4 列的数组的列。第一列(列[0])为真...第三列(列[2])为真。 最后一个是假的。 那么当我们想要return二维数组的输出时我们使用array name(a[b1, b2]),b1和b2分别是行索引和列索引。
第二行第一列变为True。因此它 returns 4. 其他都是假的。第三行和第三列也变为 True。所以,它returns 10。其他都是False。
我是这么理解的。 抱歉我的英语不好。
正确的解释是here。总结一下,
a[b1,b2]
与布尔数组 b1
和 b2
等同于 a[b1.nonzero(),b2.nonzero()]
.
nonzero()
returns 真值索引。因此,
b1.nonzero()=(array([1, 2]),)
b2.nonzero()=(array([0, 2]),)
所以,现在,我们正在使用数组进行索引。与基于数组的索引一样,返回 [1,0]th
元素 4
和 [2,2]th
元素 10
。