TypeError: 不支持的操作数类型 -: 'numpy.ndarray' 和 'numpy.ndarray'

Posted

技术标签:

【中文标题】TypeError: 不支持的操作数类型 -: \'numpy.ndarray\' 和 \'numpy.ndarray\'【英文标题】:TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'TypeError: 不支持的操作数类型 -: 'numpy.ndarray' 和 'numpy.ndarray' 【发布时间】:2013-04-26 04:07:54 【问题描述】:

我正在尝试使用原始值 salaries 从我的 sci-kit 学习模型中计算预测 y_train_actual 的均方误差。

问题:但是使用mean_squared_error(y_train_actual, salaries),我收到错误TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'。使用list(salaries) 而不是salaries 作为第二个参数会产生同样的错误。

使用mean_squared_error(y_train_actual, y_valid_actual) 我收到错误Found array with dim 40663. Expected 244768

如何将sklearn.netrucs.mean_squared_error() 转换为正确的数组类型?

代码

from sklearn.metrics import mean_squared_error

y_train_actual = [ np.exp(float(row)) for row in y_train ]
print mean_squared_error(y_train_actual, salaries)

错误

TypeError                                 Traceback (most recent call last)
<ipython-input-144-b6d4557ba9c5> in <module>()
      3 y_valid_actual = [ np.exp(float(row)) for row in y_valid ]
      4 
----> 5 print mean_squared_error(y_train_actual, salaries)
      6 print mean_squared_error(y_train_actual, y_valid_actual)

C:\Python27\lib\site-packages\sklearn\metrics\metrics.pyc in mean_squared_error(y_true, y_pred)
   1462     """
   1463     y_true, y_pred = check_arrays(y_true, y_pred)
-> 1464     return np.mean((y_pred - y_true) ** 2)
   1465 
   1466 

TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

代码

y_train_actual = [ np.exp(float(row)) for row in y_train ]
y_valid_actual = [ np.exp(float(row)) for row in y_valid ]

print mean_squared_error(y_train_actual, y_valid_actual)

错误

ValueError                                Traceback (most recent call last)
<ipython-input-146-7fcd0367c6f1> in <module>()
      4 
      5 #print mean_squared_error(y_train_actual, salaries)
----> 6 print mean_squared_error(y_train_actual, y_valid_actual)

C:\Python27\lib\site-packages\sklearn\metrics\metrics.pyc in mean_squared_error(y_true, y_pred)
   1461 
   1462     """
-> 1463     y_true, y_pred = check_arrays(y_true, y_pred)
   1464     return np.mean((y_pred - y_true) ** 2)
   1465 

C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in check_arrays(*arrays, **options)
    191         if size != n_samples:
    192             raise ValueError("Found array with dim %d. Expected %d"
--> 193                              % (size, n_samples))
    194 
    195         if not allow_lists or hasattr(array, "shape"):

ValueError: Found array with dim 40663. Expected 244768

代码

print type(y_train)
print type(y_train_actual)
print type(salaries)

结果

<type 'list'>
<type 'list'>
<type 'tuple'>

打印 y_train[:10]

[10.126631103850338, 10.308952660644293, 10.308952660644293, 10.221941283654663, 10.126631103850338, 10.126631103850338, 11.225243392518447, 9.9987977323404529, 10.043249494911286, 11.350406535472453]

打印工资[:10]

('25000', '30000', '30000', '27500', '25000', '25000', '75000', '22000', '23000', '85000')

打印清单(工资)[:10]

['25000', '30000', '30000', '27500', '25000', '25000', '75000', '22000', '23000', '85000']

打印长度(y_train)

244768

打印镜头(工资)

244768

【问题讨论】:

可以加一下y_train的shape吗?我的猜测是 y_train_actual 是 ndarrays 中的 list,这可能会在 mean_square_error() 内部发生冲突。 @fgb 我收到错误AttributeError: 'list' object has no attribute 'shape' 确实如此。你知道 y_train 的尺寸吗? @fgb len(y_train)244768 【参考方案1】:

TypeError 问题源于薪水是字符串列表,而 y_train_actual 是浮点数列表。这些不能减去。

对于您的第二个错误,您应该确保两个数组的大小相同,否则无法减去它们。

【讨论】:

我尝试了您的建议并收到错误float() argument must be a string or a number 您是否使用了np.float(),它作用于numpy.ndarrays 是的,我确实使用了np.float() 而不是float() 在上面的答案中查看我的修复。您实际上需要将列表转换为np.array(),并将np.float 转换为dtype 试过了,得到了错误TypeError: unsupported operand type(s) for -: 'numpy.ndarray' and 'numpy.ndarray'

以上是关于TypeError: 不支持的操作数类型 -: 'numpy.ndarray' 和 'numpy.ndarray'的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:不支持的操作数类型/:'str'和'str'

TypeError: *: 'int' 和 'NoneType' 不支持的操作数类型

TypeError:&:'str'和'str'不支持的操作数类型

TypeError: 不支持的操作数类型 -: 'int' 和 'list'

TypeError:不支持的操作数类型/:'float'和'datetime.timedelta'

TypeError: 不支持的操作数类型 -: 'datetime.date' 和 'str'