多维数组上的布尔索引

时间:2017-10-20 08:49:27

标签: python numpy

我在Python和Numpy中都很新。事实上,我只是在学习。

我正在阅读this tutorial,我被困在这些方面:

>>> x = np.arange(30).reshape(2,3,5)
>>> x
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],
        [25, 26, 27, 28, 29]]])
>>> b = np.array([[True, True, False], [False, True, True]])
>>> x[b]
array([[ 0,  1,  2,  3,  4],
       [ 5,  6,  7,  8,  9],
       [20, 21, 22, 23, 24],
       [25, 26, 27, 28, 29]])

我无法理解我们如何得出x [b]的结果。

我也试着猜测x[[False, False, False, True]]

的结果

请向我解释,我是一个非常新手。

2 个答案:

答案 0 :(得分:1)

1个数组中有3个数组:

[
 [ 0,  1,  2,  3,  4],
 [ 5,  6,  7,  8,  9],
 [10, 11, 12, 13, 14]
]  

使用以下行:b = np.array([[True, True, False], ...])表示您要保留前2行(前2个True值)并且您不想要最后一行(最后一个False值)。

另一部分的工作方式相同,你在1个数组中有3个数组:

[
 [15, 16, 17, 18, 19],
 [20, 21, 22, 23, 24],
 [25, 26, 27, 28, 29]
]

你的行b = np.array([..., [False, True, True]])表示不保留第一行(因为第一个值为False),但你想保留最后两行(最后两个值为True)。

答案 1 :(得分:1)

在引擎盖下,它计算掩码所覆盖的尺寸的下标索引(沿着每个尺寸的索引),从它所映射的尺寸开始,同时从未索引的轴中选择所有元素。

案例#1:3D数据和2D掩码

例如,对于两个维度的b,它会映射到两个维度,因此使用x[b],它会从第一个轴开始映射。

下标索引使用np.where/np.nonzero -

计算
r,c = np.nonzero(b)

因此,x[b]会转换为:x[r,c,:]或简单地:x[r,c]。因此,它使用advanced-indexing从索引元组对中选择每个轴轴上的元素 由rc组成。

案例#2:4D数据和2D掩码

现在,让我们将数据数组的维数增加到4D,保持相同的2D掩码,但索引凝视 从第二轴开始,即x[:,b]

假设我们有:

x = np.arange(60).reshape(2,2,3,5)

获取下标索引,然后使用advanced-indexing -

r,c = np.nonzero(b)

因此,x[:,b]应与x[:,r,c] -

相同
In [148]: x = np.arange(60).reshape(2,2,3,5)

In [149]: b = np.array([[True, True, False], [False, True, True]])

In [150]: r,c = np.nonzero(b)

In [151]: np.allclose(x[:,b], x[:,r,c])
Out[151]: True

案例#3:4D数据和3D掩码

为了更深入,让我们考虑一个带有3D数据数组的4D掩码数组,并使用前面提出的所有理论进行验证 -

In [144]: x = np.arange(60).reshape(2,2,3,5)
     ...: b = np.random.rand(2,3,5)>0.5

In [146]: r,c,p = np.nonzero(b)

In [147]: np.allclose(x[:,b], x[:,r,c,p])
Out[147]: True

对于编辑:x[[False, False, False, True]],您只沿第一个轴编制索引,其中布尔数组的长度为5,而x的第一个轴的长度小于因此报告索引错误。