python - 为什么 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
解决方案
默认情况下返回的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
它将运行得更快,并且“正常工作”(它将具有相同的大小和dtype
自动data
)。
推荐阅读
- java - JButton、JTextFeild、JLabel 设置背景颜色不起作用
- mysql - 建立具有日期间隔的报告
- javascript - 每当单击相同的按钮时如何增加值?
- javascript - X 框架选项 拒绝替代
- c# - 如何删除和更新数据库
- sql-server - ms sql 以日期格式输出
- xamarin - 使用 IdentityServer4 和 Xamarin Android 使用资源所有者密码登录会话超时通知
- python - 如何强制 Pandas 和原生 matplotlib 共享轴
- javascript - 如何在 Javascript 中获取动态 id 的值?
- android - 显示和关闭自定义对话框时,活动中的 Kotlin 合成视图为空