Python 无法根据规则将数组数据从数据类型(';float64';)强制转换为数据类型(';int32';);安全';
我有一个numpy数组,比如Python 无法根据规则将数组数据从数据类型(';float64';)强制转换为数据类型(';int32';);安全';,python,numpy,Python,Numpy,我有一个numpy数组,比如 result = np.array([[[289, 354, 331], [291, 206, 66], [242, 70, 256]], [[210, 389, 342], [273, 454, 218], [255, 87, 256]],
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,我试图屏蔽数组。i、 e我假设它在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'
我做错了什么?
提前感谢问题是,当你除以4时,你正在创建浮点值,它不想进入
int
s的数组
如果要使用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]]])
备选方案#1:
将结果
数组转换为浮点数据类型
,并使用原始的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]]])
备选方案2:
完全取消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]]])
错误解释: 这说明了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'>
>>array1=np.array([23632634],[23.567123.6])
>>>阵列1
数组([[23,632,634.],
[ 23.5, 67. , 123.6]])
>>>类型(数组1[0][0])
我们注意到,尽管列表[23,632,634]中的所有元素都是int类型(特别是'numpy.int64'),但由于第二行的元素123.6,array1中的所有元素都转换为浮点(请注意数组打印输出中的小数点)
类似地,如果我们在数组中的任何位置包含一个字符串,那么数组的所有元素都将转换为字符串:
>>> array2 = np.array([[23, 632, 'foo'],[23.5, 67, 123.6]])
>>> type(array2[0][0])
<class 'numpy.str_'>
>>array2=np.array([[23632,'foo'],[23.567123.6]]
>>>类型(数组2[0][0])
结论:
原始结果数组包含“numpy.int64”类型的元素,但
result/4
操作返回“numpy.float64”类型的元素数组(因为82/4=20.5,等等)。因此,当您尝试替换结果中的值时,它不是“安全的”,因为您无意中试图将浮点值放入整数数组。Yep。那很有效,谢谢。但是有没有办法解决我的问题呢?看看我建议的第一种方法(在我编辑的帖子中),我试图解释发生了什么。