Python numpy阵列的形状

Python numpy阵列的形状,python,arrays,numpy,Python,Arrays,Numpy,我和numpy一起工作了一段时间。然而,就在我认为我已经弄明白的时候,它又给我带来了另一条曲线。例如,我构建了3D阵列pltz,然后 >>> gridset2 = range(0, pltx.shape[2], grdspc) >>> pltz[10,:,gridset2].shape (17, 160) >>> pltz[10][:,gridset2].shape (160, 17) 这两种形状究竟为什么不同?既然索引表达式中既有一个:又

我和numpy一起工作了一段时间。然而,就在我认为我已经弄明白的时候,它又给我带来了另一条曲线。例如,我构建了3D阵列pltz,然后

>>> gridset2 = range(0, pltx.shape[2], grdspc)
>>> pltz[10,:,gridset2].shape
(17, 160)
>>> pltz[10][:,gridset2].shape
(160, 17)

这两种形状究竟为什么不同?

既然索引表达式中既有一个
又有一个列表,NumPy需要同时应用基本和高级索引规则,它们之间的交互方式有点奇怪。相关文档是,如果你想知道全部细节,你应该查阅它。我将重点讨论导致形状不匹配的部分

当使用高级索引的索引表达式的所有组件彼此相邻时,来自高级索引的结果维度将放置在结果中它们替换的维度位置。高级索引组件类似于数组,如数组、列表和标量;标量也可以用于基本索引,但出于这个目的,它们被认为是高级的。因此,如果
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
)。您的第二个表达式属于这种情况



由于第二个表达式具有由基本索引组件分隔的高级索引组件,而第一个表达式没有,因此两个表达式使用不同的索引规则。为了避免这种情况,可以将基本索引和高级索引分为两个阶段,也可以用等效的高级索引替换基本索引。无论你做什么,我建议在这些代码上面加一条解释性注释。

因为你的索引表达式中既有一个
又有一个列表,NumPy需要同时应用基本和高级索引规则,它们之间的交互方式有点奇怪。相关文档是,如果你想知道全部细节,你应该查阅它。我将重点讨论导致形状不匹配的部分

当使用高级索引的索引表达式的所有组件彼此相邻时,来自高级索引的结果维度将放置在结果中它们替换的维度位置。高级索引组件类似于数组,如数组、列表和标量;标量也可以用于基本索引,但出于这个目的,它们被认为是高级的。因此,如果
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
)。您的第二个表达式属于这种情况



由于第二个表达式具有由基本索引组件分隔的高级索引组件,而第一个表达式没有,因此两个表达式使用不同的索引规则。为了避免这种情况,可以将基本索引和高级索引分为两个阶段,也可以用等效的高级索引替换基本索引。无论您做什么,我建议您在这些代码上方添加一条解释性注释。

您应该告诉我们
gridset2
的长度和
pltz
的形状

但是我从
user2357112
给我们的文档中推断出

len(gridset2) == 17
pltz.shape[1] == 160

  • 高级索引由切片、省略号或newaxis分隔。 例如
    x[arr1,:,arr2]
  • 高级索引都在旁边 彼此例如
    x[…,arr1,arr2,:]
    但不是
    x[arr1,:,1]
    因为1是这方面的高级指数
在第一种情况下 高级索引操作产生的维度排在第一位 在结果数组中,以及之后的子空间维数。在 第二种情况下,来自高级索引操作的维度是 插入到结果数组中的位置与 初始数组

这是引文中的第一个例子,中间的一个段落。code>gridset2是

高级索引
(例如[1,2,3,…])。它被放在第一位;
[10,:]
子空间放在后面

 >>> pltz[10][:,gridset2].shape
 (160, 17)

使用
pltz[10]
,新阵列(视图)为2d`(160,N)`。现在,它将17号尺寸放在最后,即文档中的第二种情况。

您应该告诉我们
gridset2
的长度和
pltz
的形状

但是我从
user2357112
给我们的文档中推断出

len(gridset2) == 17
pltz.shape[1] == 160

  • 高级索引由切片、省略号或newaxis分隔。 例如
    x[arr1,:,arr2]
  • 高级索引都在旁边 彼此例如
    x[…,arr1,arr2,:]
    但不是
    x[arr1,:]