我在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]]
请向我解释,我是一个非常新手。
答案 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
从索引元组对中选择每个轴轴上的元素
由r
和c
组成。
案例#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
的第一个轴的长度小于因此报告索引错误。