![](/img/trans.png)
[英]Cannot cast array data from dtype('float64') to dtype('int32') according to 'safe'
[英]Cannot cast array data from dtype('float64') to dtype('int32') according to the rule 'safe'
我有一个像numpy数组
result = np.array([[[289, 354, 331],
[291, 206, 66],
[242, 70, 256]],
[[210, 389, 342],
[273, 454, 218],
[255, 87, 256]],
[[127, 342, 173],
[450, 395, 147],
[223, 228, 401]]])
我试图掩盖数组,如果一个元素大于255.即我假设它是0-1024范围并将我的值除以4
result = np.putmask(result, result > 255, result/4)
注意:结果是以前的3D数组。我收到此错误
TypeError: Cannot cast array data from dtype('float64') to dtype('int32') according to the rule 'safe'
我究竟做错了什么? 提前致谢
错误说明:
这说明了numpy数组的一个有趣属性:numpy数组的所有元素必须是相同的类型
例如,如果您有以下数组:
>>> array1 = np.array([[23, 632, 634],[23.5, 67, 123.6]])
>>> array1
array([[ 23. , 632. , 634. ],
[ 23.5, 67. , 123.6]])
>>> type(array1[0][0])
<class 'numpy.float64'>
我们注意到,即使列表[ 23,632,634 ]中的所有元素都是int类型(特别是'numpy.int64' ), array1中的所有元素都被转换为浮点数,因为元素123.6在第二行(注意数组中的小数点打印出来)。
类似地,如果我们在数组中的任何位置包含一个字符串,则数组的所有元素都将转换为字符串:
>>> array2 = np.array([[23, 632, 'foo'],[23.5, 67, 123.6]])
>>> type(array2[0][0])
<class 'numpy.str_'>
结论:
原始结果数组包含'numpy.int64'类型的元素,但result/4
操作返回类型为'numpy.float64'的元素数组(因为82/4 = 20.5等)。 因此,当您尝试并替换结果中的值时,它不是“安全”,因为您无意中尝试将浮动放入一个int数组中。
问题是当你除以4时,你正在创建浮点值,它们不想进入int
数组。
如果你想使用putmask
,并避免尝试转换为float的问题,那么你可以使用floor division( //
)来将你的值更改为int
:
np.putmask(result, result>255, result//4)
>>> result
array([[[ 72, 88, 82],
[ 72, 206, 66],
[242, 70, 64]],
[[210, 97, 85],
[ 68, 113, 218],
[255, 87, 64]],
[[127, 85, 173],
[112, 98, 147],
[223, 228, 100]]])
将result
数组转换为float dtype
,并使用原始putmask
:
result = result.astype(float)
np.putmask(result, result > 255, result/4)
>>> result
array([[[ 72.25, 88.5 , 82.75],
[ 72.75, 206. , 66. ],
[242. , 70. , 64. ]],
[[210. , 97.25, 85.5 ],
[ 68.25, 113.5 , 218. ],
[255. , 87. , 64. ]],
[[127. , 85.5 , 173. ],
[112.5 , 98.75, 147. ],
[223. , 228. , 100.25]]])
如果需要,您甚至可以转换回int:
result = result.astype(int)
array([[[ 72, 88, 82],
[ 72, 206, 66],
[242, 70, 64]],
[[210, 97, 85],
[ 68, 113, 218],
[255, 87, 64]],
[[127, 85, 173],
[112, 98, 147],
[223, 228, 100]]])
完全putmask
,你可以得到你想要的结果:
result[result > 255] = result[result > 255] / 4
>>> result
array([[[ 72, 88, 82],
[ 72, 206, 66],
[242, 70, 64]],
[[210, 97, 85],
[ 68, 113, 218],
[255, 87, 64]],
[[127, 85, 173],
[112, 98, 147],
[223, 228, 100]]])
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.