nummpy数组的真假索引

时间:2019-09-27 08:51:52

标签: python-3.x numpy

代码

import numpy as np    
a = np.arange(5)   
print(a[True])    
print(a[False])

结果

[[0 1 2 3 4]]
[]

对于上面的代码,当我将True传递给numpy数组的索引时,它将返回完整数组,而对于False,则返回一个空数组。背景情况如何?

2 个答案:

答案 0 :(得分:3)

您的示例-将标量或0D应用于布尔数组到一维数组中

print(a[True])
# [[0 1 2 3 4]]
print(a[False])
# []

为清楚起见,尤其是w.r.t.第二种(False)情况让我们查询形状

print(a[True].shape)
# (1, 5)
print(a[False].shape)
# (0, 5)

现在乍一看,这有点令人困惑。为什么要增加尺寸?

让我们从一个不太前卫的案例开始,弄清楚为什么这是逻辑行为:

x = np.arange(6).reshape(3,2)
m2 = np.array([[True,False],[True,True],[False,True]])
m1 = np.array([True,False,True])
m0 = np.array(True)

我们创建了2D数组并匹配2D,1D和0D蒙版。

使用2D蒙版进行遮罩可得到1D结果

x[m2]
# array([0, 2, 3, 5])

使用1D遮罩进行掩膜可以选择整行,从而获得2D结果

x[m1]
# array([[0, 1],
#        [4, 5]])

我们也可以在更高的维度上进行验证,即从蒙版中删除一个尺寸会为结果添加一个尺寸。

因此,逻辑上来说,我们使用0D进行遮罩确实比开始时获得了更多的一维。 2D遮罩选择单个点(0D->那些列表:1D),一维遮罩选择整个行(1D->那些列表:2D);因此,0D遮罩应该并且确实会选择整张图纸(2D->这些图纸的列表:3D);因为基本数组是2D的,所以整个都是一张纸。

x[m0]
# array([[[0, 1],
#         [2, 3],
#         [4, 5]]])

x[m0].ndim
# 3

通常:

x[m2].ndim == x.ndim - m2.ndim + 1
# True 
x[m1].ndim == x.ndim - m1.ndim + 1
# True
x[m0].ndim == x.ndim - m0.ndim + 1
# True

答案 1 :(得分:0)

  

a是您的numpy数组,即您想放置条件的[0,1,2,3,4]   如果满足条件,则返回索引,如果满足则返回该元素   然后不要丢弃那些元素。在这里,您输入的是“真”,这意味着   每个元素都满足此条件,如果   假,然后满足所有条件。检查此部分

Boolean or “mask” index arrays