首页 > 解决方案 > 为什么 numpy.int16 在我位掩码后变成 numpy.float64?

问题描述

我正在尝试位掩码并丢弃我的 data[] 的 LSB,这是一个包含 int16 的 numpy.ndarray。data = [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不允许我做一个按位或来重写LSB。

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

标签: pythonnumpy

解决方案


默认情况下返回的dtype数组的. 如果您想要不同的类型,请显式传递,例如:numpy.zerosfloat64dtype

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

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

data_new = np.zeros_like(data)

请注意,在这种特殊情况下,正确的解决方案可能只是numpy通过替换您创建的数组和循环以仅填充它来隐式地批量进行屏蔽和新数组创建:

data_new = data & -2

它将运行更快,并且“正常工作”(它将具有相同的大小和dtype自动data)。


推荐阅读