Python 无法根据规则将数组数据从数据类型(';float64';)强制转换为数据类型(';int32';);安全';

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]],

我有一个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,我试图屏蔽数组。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。那很有效,谢谢。但是有没有办法解决我的问题呢?看看我建议的第一种方法(在我编辑的帖子中),我试图解释发生了什么。