【问题标题】:non-broadcastable output operand with shape (5377,1) doesn't match the broadcast shape (5377,15)形状 (5377,1) 的不可广播输出操作数与广播形状 (5377,15) 不匹配
【发布时间】:2021-07-20 14:35:40
【问题描述】:

当我想使用 inverse_transform 转换回原始形式时,我收到以下错误:

   X_train = []
   y_train = []
for i in range(120, data_training.shape[0]):
 X_train.append(data_training[i-120:i])
 y_train.append(data_training[i,0])
X_train , y_train = np.array(X_train) , np.array(y_train)
X_train.shape , y_train.shape
((5377, 120, 15), (5377,))
train_pred=scaler.inverse_transform(train_pred)               #error
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-2819933dc538> in <module>()
      1 #Transformback to original form
----> 2 train_pred=scaler.inverse_transform(train_pred)

/usr/local/lib/python3.7/dist-packages/sklearn/preprocessing/_data.py in inverse_transform(self, X)
    434                         force_all_finite="allow-nan")
    435 
--> 436         X -= self.min_
    437         X /= self.scale_
    438         return X

ValueError: non-broadcastable output operand with shape (5377,1) doesn't match the broadcast shape (5377,15)

我刚开始接触人工智能,不明白这个错误是什么意思。

有人能解释一下这是什么意思以及如何解决吗?

【问题讨论】:

  • 我发现了类似的问题已经回答。 see
  • 我没有看到任何定义 scalertrain_pred 的内容。 sklearn Scaler.inverse_transform 需要二维输入 (n_samples, n_features)。我猜在标量设置和train_pred 之间features 的数量不匹配。

标签: python numpy


【解决方案1】:

此错误告诉您NumPy 无法对这两个数组执行逐元素操作。

发生这种情况是因为,如 here 所述,NumPy 使用了一组严格的规则:

  1. 如果两个数组的维数不同,则维数较少的数组的形状会在其前导(左侧)侧填充一个。
  2. 如果两个数组的形状在任何维度上都不匹配,则该维度中形状等于 1 的数组将被拉伸以匹配另一个形状。
  3. 如果在任何维度上大小不一致且都不等于 1,则会引发错误。

由于数组的形状是(5377,1)(5377,15) - 它们属于第二类,所以第一个数组的尺寸为(5377,1),被拉伸以适应形状为(5377,15) 的数组。

然后,如-= 所示,您尝试将其分配回形状为(5377,1) 的那个,这会引发错误。

你可以做的是:

使用X = X - self.min_ 代替X -= self.min_

import numpy as np

X = np.random.randn(5377).reshape((5377,1))
min_ = np.random.randn(5377*15).reshape((5377,15))

X = X - min_
X

或者,如果X 应该保持初始形状(5377, 1),您可以对列求和:

import numpy as np

X = np.random.randn(5377).reshape((5377,1))
min_ = np.random.randn(5377*15).reshape((5377,15))

X = (X - min_).sum(axis=1)
X

但是你应该从你使用的算法的角度考虑这个结果是否符合你的需求。

干杯

【讨论】:

    猜你喜欢
    • 2018-05-09
    • 2019-09-01
    • 2020-03-07
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多