【问题标题】:ValueError: operands could not be broadcast together with shapes - inverse_transform- PythonValueError:操作数无法与形状一起广播 - 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 中的广播错误吗?任何建议都会有所帮助。提前致谢!

【问题讨论】:

    标签: python arrays numpy scikit-learn broadcast


    【解决方案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) 维度,这就是您遇到此问题的原因。

    【讨论】:

      猜你喜欢
      • 2012-10-31
      • 2013-04-07
      • 2014-08-24
      • 1970-01-01
      • 2017-09-09
      • 2012-08-05
      • 2018-08-18
      • 2020-06-20
      • 2018-12-26
      相关资源
      最近更新 更多