Python中matrix计算小问题

来源:互联网 发布:百度云管家mac下载 编辑:程序博客网 时间:2024/06/18 18:16

今天在敲别人代码的过程中遇到了一个这样的问题:

代码是:

   erros = mat(target)-mat(output)         # 计算误差-误差函数

错误是:

TypeError: unsupported operand type(s) for -: 'matrix' and 'matrix'

很奇怪既然类型都是matrix,怎么会不能用减操作?

我输出了两个矩阵的类型和形状:

(<class 'numpy.matrixlib.defmatrix.matrix'>, (100L, 1L), <class 'numpy.matrixlib.defmatrix.matrix'>, (100L, 1L))

也完全一致。甚至我将他们转为array, 也不能用减操作

于是我写了一个循环来做它们单个元素之间的减法:

for i in range(shape(target)[0]):    for j in range(shape(target)[1]):        erros[i, j] = float(target[i, j]) - output[i, j]

终于看到不一样的错误提示:

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

原来是矩阵单个元素的类型不一致,转换类型,解决问题!

所以在此提醒大家,遇到这种奇怪的同类型不能做运算的错误提示时考虑他们的子元素类型是否一致!

当然希望大家都不会遇到这种弱智bug..........


之所以会出现这个bug, 是因为output矩阵内,元素类型自动转换的原因。

output[:,0] =1   # 矩阵第一列全为1->b
output[:,1:]=dataSet[:,:-1] # 第二列到倒数第二列保持原数据,最后一列被删除
这里的dataMat最后被赋给了output

在进行这个操作之前output和target的子元素变量类型是一致的,<type 'numpy.string_'>

这个操作之后output的子元素类型变为<type 'numpy.float64'>

所以,是这条语句改变了output的变量类型:

output[:,0] =1

0 0
原创粉丝点击