为什么我对位进行屏蔽后numpy.int16变为numpy.float64?

时间:2019-03-19 05:35:42

标签: python numpy

我正在尝试位屏蔽并丢弃数据[]的LSB,这是一个包含int16的numpy.ndarray。数据= [2,0,4,......,-2,-4] 因此,我创建了一个新数组,并使用-2位屏蔽,就16位二进制而言,它应为1111111111111110。

data_new = np.zeros(len(data))
for i in range(len(data)):
    data_new[i] = np.int16(data[i] & -2) 

以某种方式,输出不是int16的数组。它变为numpy.float64。而且python不允许我按位执行OR来重写LSB。

TypeError: unsupported operand type(s) for |: 'numpy.float64' and 'int'
>>type(data[0])
numpy.int16
>>type(data_new[0])
numpy.float64

1 个答案:

答案 0 :(得分:2)

dtype返回的数组的numpy.zeros默认为float64。如果您要使用其他类型,则可以显式地传递dtype,例如:

data_new = np.zeros(len(data), np.int16)

或者如果data已经是正确的大小和dtype,请使用np.zeros_like复制其格式和结构:

data_new = np.zeros_like(data)

请注意,在这种情况下,正确的解决方案可能只是让numpy隐式地通过替换数组的创建并循环以仅填充{ :

data_new = data & -2

运行速度更快,并且“正常工作”(它的大小和dtypedata自动相同)。