【问题标题】:How to reshape this numpy array to exclude the "extra dimension"?如何重塑这个 numpy 数组以排除“额外维度”?
【发布时间】:2023-03-23 12:50:01
【问题描述】:

我有一个 numpy 数组 arr1 它是函数的输出。该数组具有由 numpy 数组中的每个元素被转换为 numpy 数组本身引起的“额外”维度。

arr1.shape 输出(100, 20, 1)

如果我打印数组,print(arr1[0]) 输出

array([[-212537.61715316],
       [   7258.38476409],
       [  37051.91250884],
       [-146278.00512207],
       [-185792.24620168],
       [-200794.59538468],
       [-195981.27879612],
       [-177912.26034464],
       [-152212.805867  ],
       [-118873.26452198],
       [ -64657.64682999],
       [ 306884.11196766],
       [-191073.9891907 ],
       [-104992.44840277],
       [ -67834.43041102],
       [ -21810.77063542],
       [  17307.24511071],
       [  55607.49775471],
       [  91259.82533592],
       [ 119207.40589797]])

如果我用arr1.reshape((100,20)) 重塑,我会得到print(arr1.reshape((100,20))[0]) 的以下输出:

array([-212537.61715316,    7258.38476409,   37051.91250884,
       -146278.00512207, -185792.24620168, -200794.59538468,
       -195981.27879612, -177912.26034464, -152212.805867  ,
       -118873.26452198,  -64657.64682999,  306884.11196766,
       -191073.9891907 , -104992.44840277,  -67834.43041102,
        -21810.77063542,   17307.24511071,   55607.49775471,
         91259.82533592,  119207.40589797])

我的问题是:如何排除这个“额外”的,但保留数组arr1 的原始形状?

使用.reshape()的最佳方法是什么?如果没有,最好的方法是什么?

【问题讨论】:

  • 我想你在找numpy.squeeze
  • "我如何排除这个“额外的”,但保留数组 arr1 的原始形状" - 你想改变形状,但保留原始形状?你似乎在与自己作对。您要保留的原始数组确切地说是什么?
  • @user2357112 我可能不清楚。让我编辑上面的内容。我是说我的原始数组是一个数组,其中每个浮点数本身就是一个数组。这并不理想。将每个元素转换为浮点数的“标准 Python”方法是什么?

标签: python arrays numpy


【解决方案1】:

您正确使用reshape

 arr2 = arr1.reshape((100,20))

它的形状将是 (100,20),与没有最后一个维度的 arr1 相同。

arr1[0] 的形状为 (20,1),因此打印为列。

arr2[0] 的形状为 (20,),因此打印为一行(计算括号)。你可能不喜欢这个显示,但形状是正确的。

squeeze也可以用来取出多余的维度,但是结果是一样的。

print(arr2[0][:,None]) 应该打印为一列。它在打印之前有效地添加了额外的尺寸。

【讨论】:

  • 感谢您的解释。这正是我要问的。
【解决方案2】:

您可能正在寻找numpy.squeeze:

http://docs.scipy.org/doc/numpy-1.10.1/reference/generated/numpy.squeeze.html

a = np.arange(10*20).reshape((10, 20, 1))
print(a.shape)
# (10, 20, 1)
a = a.squeeze()
print(a.shape)
# (10, 20)

请注意另一个答案,因为您的 reshape 应该可以工作,您只是错误地查看了输出。

【讨论】:

  • 完美!我从来不知道这存在。谢谢!
  • 您能否在正文中包含相关代码 sn-p,因为外部链接可能会失效。 (另外,很好的答案,记下了以备将来使用)。
  • @ShanZhengYang 注意 hpaulj 的回答,因为reshape 也应该适合你。
  • 如果其他维度之一恰好长度为 1,那么事情就会中断。我觉得squeeze 是一种危险的便利。
  • @user2357112 是的,为了解决 OP 的原始问题,这只是发生工作,因为只有一个尺寸为 1,但有时人们实际上想做squeeze做。所以它并不危险,它只是对解决它所解决的问题有用。
猜你喜欢
  • 2019-11-10
  • 2021-02-16
  • 2016-11-07
  • 2017-06-10
  • 2020-04-04
  • 1970-01-01
  • 2018-09-02
  • 2020-03-18
  • 2013-07-08
相关资源
最近更新 更多