【问题标题】:resulting array shape when dropping dimension in numpy在 numpy 中删除维度时产生的数组形状
【发布时间】:2018-09-17 01:41:54
【问题描述】:

试图了解 numpy 在超过 2 维索引时如何选择元素。

import numpy as np
x = np.arange(24).reshape(2,3,4)
x[:,:,0].shape #(2, 3)

在写作x[:,:,0] 时,我选择了沿“深度”、所有“行”和第一列的所有元素。当从视觉上考虑这一点时,我会认为 numpy 会返回形状为 (2,3,1) 的东西,但最后一个维度被删除了。这是合理的,但 numpy 如何填充结果?即在这个例子中,为什么x[:,:,0] 导致元素[0,12] 形成第一列。只是想弄清楚出于某种原因我目前不理解的一般逻辑。

【问题讨论】:

  • 如果您从一维数组开始,x[0] 可能会有所帮助。然后是一个二维数组,x[:,0]x[0,:] 等。numpy 尝试在所有维度上保持一致。还可以使用列表或切片探索索引。
  • 好主意 - 我可能只需要重新阅读文档,不知道为什么我没有得到这个显然很简单
  • @Alex 可能有助于将索引中的从左到右视为“从头到尾”轴。然后最后一个轴是显示数组时从左到右打印的轴。从最后一个轴获取每个第一个元素。现在不要忘记我们不想从其他轴上取下括号(因为我们为它们取了完整的切片)。这给出了你的结果。请注意,您也可以将其写为x[..., 0]
  • @miradulo 你能扩展一下吗?我不确定我是否清楚你的意思
  • 我不确定 :P 也许 hpaulj 建议从一维数组开始并逐步提高可能会更有帮助。

标签: python arrays numpy indexing slice


【解决方案1】:

一般的 NumPy 索引很复杂,但这仍然是简单的情况。我一直觉得从索引结果如何对应于索引原始数组的角度进行思考是有帮助的。

x[:, :, 0] 的结果是一个数组,对于任何索引 ij

result[i, j] == x[i, j, 0]

同样,如果将 5D 数组 a 索引为 a[:, 1, :, 2, :],则结果是这样的

result[i, j, k] == a[i, 1, j, 2, k]

【讨论】:

  • 我喜欢这样的思路:您能否给出一些关于删除维度时发生的情况的直觉(我明白您提出的(i,j) 点)?即在前我提供的它保留原始的二维.. 使新数组适合这个形状,你必须转置,因为过去的深度现在是行,而过去的行现在是列。
  • @Alex:NumPy 数据表示不像列表列表,其中删除或重新排序维度需要物理重建整个事物。 NumPy 只是计算新的形状和步幅信息,因此它知道在原始数据缓冲区中查找result[i, j] 的位置。
  • 这可能有助于read about NumPy 数组数据表示的工作原理。
  • 好主意 - 将看看内部结构.. 还没有做到这一点。可能会解决我的困惑
猜你喜欢
  • 1970-01-01
  • 2016-09-06
  • 1970-01-01
  • 1970-01-01
  • 2016-04-20
  • 1970-01-01
  • 1970-01-01
  • 2021-04-21
  • 2021-02-16
相关资源
最近更新 更多