【问题标题】:Can't reshape numpy array无法重塑 numpy 数组
【发布时间】:2013-12-13 17:25:39
【问题描述】:

我有一个函数,它应该采用一维整数数组并将其整形为一个 1x3 数组的二维数组。然后它应该获取每个 1x3 数组并将其转换为 3x1 数组。结果应该是 3x1 数组的二维数组。这是我的功能

def RGBtoLMS(rgbValues, rgbLength): #Method to convert from RGB to LMS
    print rgbValues
    lmsValues = rgbValues.reshape(-1, 3)
    print lmsValues
    for i in xrange(len(lmsValues)):
        lmsValues[i] = lmsValues[i].reshape(3, 1)

    return lmsValues

当我尝试将 1x3 数组更改为 3x1 数组时,问题就出现了。我得到以下输出假设 rgbValues = [14, 25, 19, 24, 25, 28, 58, 87, 43]

[14 25 19 ..., 58 87 43]
[[14 25 19]
 [24, 25, 28]
 [58 87 43]]

ValueError [on line lmsValues[i] = lmsValues[i].reshape(3, 1)]: could not broadcast input array from shape (3,1) into shape (3)

我怎样才能避免这个错误?

【问题讨论】:

  • 当你说 1x3 数组的二维数组时,它的形状是 (n, n, 1, 3) 吗?这里的一个例子可能有助于澄清!
  • 主要问题是lmsValues 的每个条目都已经具有指定的形状,因此不允许将某些东西分配给具有不同形状的条目。我同意 @AndyHayden 的观点,但是,您的输入和预期输出的简单示例将有助于回答您的问题。
  • 已编辑,现在应该更清楚了
  • 我认为“1x3 数组的二维数组”的意思是“形状为(n, 3) 的二维数组”。 @Nick,在numpy中,数组只是一个对象,无论是1d还是2d还是nd。对于列表,如果它是“二维”,我们说“列表列表”,但在 numpy 中,这只是一个“二维数组”。此外,我们仍然不知道您想要的输出是什么样的。

标签: python numpy multidimensional-array reshape


【解决方案1】:

正如 cmets 中所述,您实际上总是只是修改具有不同形状的一个数组。在 numpy 中说你有一个 1 x 3 数组的二维数组并没有什么意义。这实际上是一个n x 3 数组。

我们从长度为 3*n 的一维数组开始(我在您的示例中添加了三个数字以明确 3 x nn x 3 数组之间的区别):

>>> import numpy as np

>>> rgbValues = np.array([14, 25, 19, 24, 25, 28, 58, 87, 43, 1, 2, 3])
>>> rgbValues.shape
(12,)

并将其重塑为n x 3

>>> lmsValues = rgbValues.reshape(-1, 3)
>>> lmsValues
array([[14, 25, 19],
       [24, 25, 28],
       [58, 87, 43],
       [ 1,  2,  3]])
>>> lmsValues.shape
(4, 3)

如果你想让每个元素都被塑造成3 x 1,也许你只是想转置数组。这会切换行和列,所以形状是3 x n

>>> lmsValues.T
array([[14, 24, 58,  1],
       [25, 25, 87,  2],
       [19, 28, 43,  3]])

>>> lmsValues.T.shape
(3, 4)

>>> lmsValues.T[0]
array([14, 24, 58,  1])

>>> lmsValues.T[0].shape
(4,)

如果您真的希望lmsValues 中的每个元素 成为1 x 3 数组,您可以这样做,但它必须是形状为n x 1 x 3 的3d 数组:

>>> lmsValues = rgbValues.reshape(-1, 1, 3)
>>> lmsValues
array([[[14, 25, 19]],

       [[24, 25, 28]],

       [[58, 87, 43]],

       [[ 1,  2,  3]]])

>>> lmsValues.shape
(4, 1, 3)

>>> lmsValues[0]
array([[14, 25, 19]])

>>> lmsValues[0].shape
(1, 3)

【讨论】:

  • 真的,1x3 数组的 2D 数组将是 4D 数组。或者它可以是dtype=object 的二维数组,其中每个元素都是一个二维 1x3 数组。这两个绝对是可行的。但是,这两个似乎都不是 OP 真正想做的事情。我认为这个答案是他真正想要的,即使他不知道。
  • 哈哈,从语义上讲,我认为你是对的,@abarnert,但这不会涉及尺寸变化吗?或者,我想可能是(n, 1, 1, 3),哈哈。但是,是的,我的猜测是转置是他所追求的。
  • 是的,无需调整大小,(n, 1, 1, 3)。或(1, n, 1, 3)。是每个维度提升一次,还是同一个维度连续列出两次更不合理?这取决于你想要做什么,我不知道他为什么说他想要一个 1x3 数组的二维数组。 (特别是因为我不认为他真的想要那个,他想要一个 1x3 数组的一维数组,就像你给他的那样。)
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 2020-08-29
  • 2020-06-13
  • 1970-01-01
  • 2020-12-21
  • 2016-02-10
  • 2018-02-17
相关资源
最近更新 更多