ValueError:操作数无法与形状一起广播 - inverse_transform- Python

Posted

技术标签:

【中文标题】ValueError:操作数无法与形状一起广播 - inverse_transform- Python【英文标题】:ValueError: operands could not be broadcast together with shapes - inverse_transform- Python 【发布时间】:2018-02-01 11:22:18 【问题描述】:

我知道ValueError 的问题已经被问了很多times。我仍在努力寻找答案,因为我在代码中使用了inverse_transform

假设我有一个数组a

a.shape
> (100,20)

还有另一个数组b

b.shape
> (100,3)

当我做np.concatenate时,

hat = np.concatenate((a, b), axis=1)

现在hat 的形状是

hat.shape    
(100,23)

在这之后,我尝试这样做,

inversed_hat = scaler.inverse_transform(hat)

当我这样做时,我收到一个错误:

ValueError: 操作数无法与形状 (100,23) (25,) (100,23) 一起广播

这是inverse_transform 中的广播错误吗?任何建议都会有所帮助。提前致谢!

【问题讨论】:

【参考方案1】:

虽然您没有指定,但我假设您使用的是 scikit learn 的 StandardScaler 中的 inverse_transform()。您需要先拟合数据。

import numpy as np
from sklearn.preprocessing import MinMaxScaler


In [1]: arr_a = np.random.randn(5*3).reshape((5, 3))

In [2]: arr_b = np.random.randn(5*2).reshape((5, 2))

In [3]: arr = np.concatenate((arr_a, arr_b), axis=1)

In [4]: scaler = MinMaxScaler(feature_range=(0, 1)).fit(arr)

In [5]: scaler.inverse_transform(arr)
Out[5]:
array([[ 0.19981115,  0.34855509, -1.02999482, -1.61848816, -0.26005923],
       [-0.81813499,  0.09873672,  1.53824716, -0.61643731, -0.70210801],
       [-0.45077786,  0.31584348,  0.98219019, -1.51364126,  0.69791054],
       [ 0.43664741, -0.16763207, -0.26148908, -2.13395823,  0.48079204],
       [-0.37367434, -0.16067958, -3.20451107, -0.76465428,  1.09761543]])

In [6]: new_arr = scaler.inverse_transform(arr)

In [7]: new_arr.shape == arr.shape
Out[7]: True

【讨论】:

感谢您的回复,我知道,我应该提到,我使用了MinMaxScaler。例如:scaler = MinMaxScaler(feature_range=(0, 1)). 我试过你的答案,当我有fit 时它可以工作,但是我有fit_transform 它给出了一个错误AttributeError: 'numpy.ndarray' object has no attribute 'inverse_transform'。我用fit_transform。你知道为什么会这样吗?我正在搜索这个。 是的,fit_transform() 返回一个数据集,fit() 将生成一个对象,您可以从中调用其他方法。如果您阅读docs,您可以看到fit() 没有返回类型,而fit_transform() 返回一个numpy 数组。 谢谢!这很有帮助!我有一个类似的问题datascience.stackexchange.com/questions/22488/… 和这个tutel.me/c/programming/questions/42997228/… @Jesse Ya 在这两个问题中,你需要做类似scaler = MinMaxScaler().fit(dataset) 的事情,然后扩展你的数据集,做scaled_data = scaler.transform(dataset),然后在你尝试做的时候做 inverse_transform , 做scaler.inverse_transform(inv_yhat)【参考方案2】:

您似乎正在使用 sklearn.preprocessing 的预拟合 scaler 对象。 如果这是真的,根据我的说法,您用于拟合的数据是 (x,25) 维度,而您的数据形状是 (x,23) 维度,这就是您遇到此问题的原因。

【讨论】:

以上是关于ValueError:操作数无法与形状一起广播 - inverse_transform- Python的主要内容,如果未能解决你的问题,请参考以下文章

如何修复Tensorflow中的“ValueError:操作数无法与形状(2592,)(4,)一起广播”?

SpaCy - ValueError:操作数无法与形状一起广播(1,2)(1,5)

ValueError:操作数无法与形状一起广播 - inverse_transform- Python

ValueError:在进行加权预测时,操作数无法与形状 (7,) (624,3) 一起广播

ValueError:操作数无法与形状一起广播(11,384)(96,)(11,384)

ValueError:形状 (3,1) 的不可广播输出操作数与广播形状 (3,4) 不匹配