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'