当前位置: 首页 > 面试题库 >

为什么将数组用作索引会更改多维ndarray的形状?

江礼骞
2023-03-14
问题内容

我有一个4-D NumPy数组,轴说x,y,z,t。我想取对应于t = 0的切片,并在y轴上排列顺序。

我有以下

import numpy as np
a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]
b.shape

我得到(5,4,3)而不是(4,5,3)。

我何时输入

aa = a[:,:,:,0]
bb = aa[:,[1,2,3,4,0],:]
bb.shape

我得到了预期的(4,5,3)。有人可以解释为什么第一个版本交换前两个维度吗?


问题答案:

正如@hpaulj在评论中提到的,此行为是由于 混合了基本切片 高级索引

a = np.arange(120).reshape(4,5,3,2)
b = a[:,[1,2,3,4,0],:,0]

在上面的代码片段中,发生了以下情况:

  • 当我们沿最后一个维度进行基本切片时,它会触发__getitem__调用。因此,该维度已消失。(即没有单例尺寸)
  • [1,2,3,4,0]从第二维返回5个切片。有两种可能性将此形状放在返回的数组中:在第一个位置或最后一个位置。NumPy决定将其放在第一个维度。这就是为什么5, ...在返回的形元组的第一个位置上得到5()的原因。如果我没记错的话,Jaime在一次PyCon谈话中对此进行了解释。

  • 沿着第一维和第三维,由于您使用进行:了切片,因此保留了沿这些维的原始长度。

将所有这些放在一起,NumPy返回形状元组为: (5, 4, 3)

您可以在numpy-indexing-ambiguity-
in-3d-arrays
和arrays.indexing#combining-advanced-and-basic-
indexing上
了解更多有关它的信息。



 类似资料:
  • 问题内容: 我有一个索引元组数组,我想用它从多维numpy数组中选取值, 理解只有在已知的情况下才有效。 有什么提示吗? 问题答案: 您可以将的转置版本转换为元组,然后为矢量化解决方案建立索引-

  • 考虑: 为什么改变的值会改变的值?

  • 一个numpy数组a a = numpy.arange(12) 形状为a.shape = (12,) 为什么我们需要逗号?形状(12)是为其他东西保留的吗?

  • 问题内容: 我正在尝试获取索引以按最后一个轴对多维数组进行排序,例如 我想要这样的索引, 根据numpy.argsort的文档,我认为应该执行此操作,但出现错误: 编辑:我需要重新排列相同形状的其它阵列(例如阵列,使得以相同的方式)…以便 问题答案: 上面的答案现在已经过时了,因为在numpy 1.15中添加了新功能以使其更简单。take_along_axis(https://docs.scipy

  • 问题内容: 我的动机是利用熊猫功能来进行滚动多因素回归(这个问题是 不是 关于滚动多因素回归)。我希望我可以在a之后使用,并使用所得结果提取ndarray并执行必要的矩阵乘法。那样行不通。 这是我发现的: 对象是什么样的: 矩阵乘法的行为正常: 使用Apply执行逐行点积的行为符合预期: Groupby-> Apply的行为符合我的预期: 但是当我跑步时: 我得到: AttributeError:

  • 问题内容: 我编写了以下JavaScript: 此代码声明一个变量并将其设置为数组值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。不知何故,当我对执行操作时,似乎对执行了相同的操作。 然后,代码对数字值执行相同的操作:声明一个变量并将其设置为数字值。然后,它声明第二个变量并将其设置为。它对进行操作,然后向和发出警报。在这里,我得到预期的行为:对不同的价值观和。 数组与Jav