我在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'
我认为你不需要具体细节,因为这发生在几个不同数字类型的不同地方。
它适用于所有计算机没问题。我写的所有东西都适合他们,但他们经常写的东西对我来说都不起作用。
我们的机器是否有理由不同意,是否有办法改变我的目标?
谢谢!
答案 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)
一个问题是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')