首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >为什么python中的计算机之间的强制转换规则会有所不同?

为什么python中的计算机之间的强制转换规则会有所不同?
EN

Stack Overflow用户
提问于 2013-01-11 07:28:08
回答 2查看 6.6K关注 0票数 17

我在我的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'

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

它可以在他们所有的电脑上运行,没有问题。我写的每一件事都适合他们,但他们写的东西有时对我不起作用。

我们的机器有没有不一致的原因,我有没有办法改变我那一端的东西?

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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)
票数 16
EN

Stack Overflow用户

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

谢谢你的帮助!

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14269164

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档