为什么在python中的计算机之间的转换规则不同?

zac*_*618 17 python macos numpy

我正在Mac上运行python 2.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'
Run Code Online (Sandbox Code Playgroud)

我不认为你需要具体细节,因为这发生在几个不同数字类型的不同地方.

它适用于他们所有的电脑没问题.我写的所有东西都适合他们,但他们经常写的东西对我来说都不起作用.

有没有理由说我们的机器不同意,有没有办法可以改变我的方式?

谢谢!

nne*_*neo 16

这个帖子表明你numpy比同事使用的版本更新(请检查使用numpy.version.version).在1.7.0开发分支中,似乎他们已经将隐式强制转换规则更改为更严格的same_kind规则,该规则禁止(除其他事项)浮点数和整数格式之间的强制转换.

要解决这个问题,我建议使用这样的代码:

img[:middle] *= (bg[0]/np.tile(topCol, (middle,1))).astype(img.dtype)
Run Code Online (Sandbox Code Playgroud)


zac*_*618 5

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'
Run Code Online (Sandbox Code Playgroud)

一个解决方法:

我可以更改初始变量类型定义以匹配以后需要的内容:

img = np.float64( cp.deepcopy(imgArray) )
...
img[:middle] *= bg[0]/np.tile(topCol, (middle,1))
Run Code Online (Sandbox Code Playgroud)

或者我可以保留原始类型转换,并更改运算符:

img = np.int16( cp.deepcopy(imgArray) )
...
img[:middle] = img[:middle]*bg[0]/np.tile(topCol, (middle,1))
Run Code Online (Sandbox Code Playgroud)

出于某种原因,Numpy允许以这种方式进行操作,而不是这样 *=

感谢您的帮助!