我在我的Mac上运行Python2.7,我正在和其他使用Ubuntu的人一起开发一个群组编码项目。偶尔,他们写的代码不能在我的计算机上运行,因为强制转换规则错误:
273 # Apply column averages to image
--> 274 img[:middle] *= (bg[0]/np.tile(topCol, (middle,1)))
275 img[middle:] *= bg[1]/np.tile(botCol, (middle,1))
276
TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int16') with casting rule 'same_kind'
我认为你不需要细节,因为这发生在几个不同的地方,具有不同的数字类型。
它可以在他们所有的电脑上运行,没有问题。我写的每一件事都适合他们,但他们写的东西有时对我不起作用。
我们的机器有没有不一致的原因,我有没有办法改变我那一端的东西?
谢谢!
发布于 2013-01-11 09:26:24
This thread建议您的numpy
比您的同事正在使用的版本新(请使用numpy.version.version
进行检查)。在1.7.0开发分支中,他们似乎已经将隐式强制转换规则更改为更严格的same_kind
规则,该规则禁止(以及其他内容)在浮点和整数格式之间进行强制转换。
为了解决这个问题,我建议使用如下代码:
img[:middle] *= (bg[0]/np.tile(topCol, (middle,1))).astype(img.dtype)
发布于 2013-01-12 04:20:23
nneonneo有一个正确的解决方案,我想我应该添加一些其他的变通方法。
一个问题是,img
变量早先是手动定义为int
的。然后,与float
的乘法违反了严格的类型转换
img = np.int16( cp.deepcopy(imgArray) )
...
img[:middle] *= bg[0]/np.tile(topCol, (middle,1))
>>TypeError: Cannot cast ufunc multiply output from dtype('float64') to dtype('int16') with casting rule 'same_kind'
一种解决方法是:
我可以更改初始变量类型定义,以匹配稍后需要的内容:
img = np.float64( cp.deepcopy(imgArray) )
...
img[:middle] *= bg[0]/np.tile(topCol, (middle,1))
或者我可以保留原始类型转换,并更改运算符:
img = np.int16( cp.deepcopy(imgArray) )
...
img[:middle] = img[:middle]*bg[0]/np.tile(topCol, (middle,1))
出于某种原因,Numpy允许以这种方式进行操作,而*=
则不允许
谢谢你的帮助!
https://stackoverflow.com/questions/14269164
复制相似问题