gpt4 book ai didi

python - numpy 数组的形状

转载 作者:太空宇宙 更新时间:2023-11-04 08:04:17 25 4
gpt4 key购买 nike

使用 numpy 已经有一段时间了。然而,就在我认为我已经弄清楚数组的时候,它又抛出了另一条曲线。例如,我构建了 3D 数组 pltz,然后

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

这两种形状到底为什么不同?

最佳答案

由于您的索引表达式同时包含 : 和列表,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)。你的第二个表达属于这种情况。


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

关于python - numpy 数组的形状,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34317536/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com