现在和numpy一起工作了一段时间。就在我认为我已经找到数组的时候,它又引发了另一条曲线。例如,我构建了3D数组pltz,然后
>>> gridset2 = range(0, pltx.shape[2], grdspc)
>>> pltz[10,:,gridset2].shape
(17, 160)
>>> pltz[10][:,gridset2].shape
(160, 17)
为什么地球上的两种形状不同?
答案 0 :(得分:3)
由于索引表达式同时包含:
和列表,因此NumPy需要应用基本和高级索引规则,并且它们的交互方式有点奇怪。相关文档为here,如果您想了解详细信息,请咨询相关文档。我将专注于导致这种形状不匹配的部分。
当使用高级索引的索引表达式的所有组件彼此相邻时,来自高级索引的结果的维度将放置到它们替换的维度的位置中的结果中。高级索引组件类似于数组,例如数组,列表和标量;标量也可用于基本索引,但为此目的,它们被认为是高级的。因此,如果arr.shape == (10, 20, 30)
和ind.shape = (2, 3, 4)
,那么
arr[:, ind, :].shape == (10, 2, 3, 4, 30)
你的第一个表达就属于这种情况。
另一方面,如果使用高级索引的索引表达式的组件由使用基本索引的组件分隔,则没有明确的位置来插入高级索引维。例如,使用
arr[ind, :, ind]
结果需要有长度为2,3,4和20的尺寸,并且没有任何好处可以粘住20。
当高级索引组件由基本索引组件分隔时,NumPy会粘贴结果数组开头的高级索引所产生的所有维度。基本索引组件为:
,...
和np.newaxis
(None
)。你的第二个表达就属于这种情况。
由于您的第二个表达式具有由基本索引组件分隔的高级索引组件,并且您的第一个表达式不是,因此您的两个表达式使用不同的索引规则。为避免这种情况,您可以将基本索引和高级索引分为两个阶段,或者可以使用等效的高级索引替换基本索引。无论你做什么,我建议在这样的代码上面加上解释性注释。
答案 1 :(得分:3)
您应该告诉我们gridset2
的长度和pltz
的形状。
但我从user2357112
给我们的文件中推断出
len(gridset2) == 17
pltz.shape[1] == 160
- 高级索引由切片,省略号或新轴分隔。 例如
x[arr1, :, arr2]
。- 高级索引就在旁边 彼此。例如
x[..., arr1, arr2, :]
但不是x[arr1, :, 1]
因为1是这方面的先进指数。在第一种情况下, 高级索引操作产生的尺寸首先出现 在结果数组中,以及之后的子空间维度。在里面 第二种情况,高级索引操作的维度是 在结果数组中插入与它们相同的位置 初始数组
>>> pltz[10,:,gridset2].shape
(17, 160)
这是报价中的第一个案例,中间是一个切片。 gridset2
为advanced indexing
(例如[1,2,3,...])。它是第一个; [10,:]
子空间放在。
>>> pltz[10][:,gridset2].shape
(160, 17)
pltz[10]
,新数组(视图)为2d`(160,N)'。现在它的大小是17 dim,第二种是文档。