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

时间:2013-01-10 23:28:08

标签: 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'

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

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

我们的机器是否有理由不同意,是否有办法改变我的目标?

谢谢!

3 个答案:

答案 0 :(得分:16)

This thread表示您的numpy比您的同事使用的版本更新(请使用numpy.version.version进行检查)。在1.7.0开发分支中,似乎他们已经将隐式转换规则更改为更严格的same_kind规则,该规则禁止(除其他事项)浮点数和整数格式之间的转换。

要解决此问题,我建议使用以下代码:

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

答案 1 :(得分: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'

一个解决方法:

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

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允许以这种方式进行操作,而不是*=

感谢您的帮助!

答案 2 :(得分:2)

引用numpy(http://docs.scipy.org/doc/numpy-dev/release.html)的开发者:

  

inplace操作的默认转换已更改为“same_kind”。例如,如果n是一个整数数组,而f是一个浮点数组,则n + = f将导致TypeError,而在之前的Numpy版本中,浮点数将被静默地转换为整数。在不太可能的情况下,示例代码不是实际的错误,可以通过将其重写为np.add(n,f,out = n,casting ='unsafe')以向后兼容的方式更新。自Numpy 1.7以来,旧的“不安全”默认值已被弃用。

因此,如果你想保持inplace multiplication,代码变成:

np.multiply(img[:middle], (bg[0]/np.tile(topCol, (middle,1))), out=img[:middle], casting='unsafe')