Python numpy阵列的形状
我和numpy一起工作了一段时间。然而,就在我认为我已经弄明白的时候,它又给我带来了另一条曲线。例如,我构建了3D阵列pltz,然后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) 这两种形状究竟为什么不同?既然索引表达式中既有一个:又
>>> 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,:]
因为1是这方面的高级指数李>x[arr1,:,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,:]