为了账号安全,请及时绑定邮箱和手机立即绑定

检查 numpy 数组与特定 NaN 是否相等

检查 numpy 数组与特定 NaN 是否相等

12345678_0001 2023-06-27 16:27:37
大多数浮点表示中可能有几种不同类型的 NaN(例如安静 NaN、信号 NaN 等)。我认为这在 numpy 中也是如此。我有 NaN 的特定位表示,在 C 中定义并导入到 python 中。我希望测试一个数组是否完全包含这个特定的浮点位模式。有什么办法可以做到这一点吗?请注意,我想测试数组是否包含这个特定的NaN,而不是测试它是否包含一般的 NaN。
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

Numpy 允许您直接访问数组中的字节。对于简单的情况,您可以直接将 nans 视为整数:


quiet_nan1 = np.uint64(0b0111111111111000000000000000000000000000000000000000000000000000)


x = np.arange(10, dtype=np.float64)

x.view(np.uint64)[5] = quiet_nan1


x.view(np.uint64)

现在您只需比较确切 NaN 的位模式的元素即可。该版本将保留形状,因为元素大小相同。


float128一个更通用的解决方案是使用字节,它可以让您使用在大多数系统上没有相应整数模拟的类型:


quiet_nan1l = np.frombuffer((0b01111111111111111000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000).to_bytes(16, 'big'))


x = np.arange(3 * 4 * 5, dtype=np.float128).reshape3, 4, 5)

x.view(np.uint8).reshape(*x.shape, 16)[2, 2, 3, :] = quiet_nan1l


x.view(np.uint8).reshape(*x.shape, 16)

最终的重塑并不是绝对必要的,但它非常方便,因为它沿着最后一个维度隔离了原始数组元素。


在这两种情况下,修改视图都会修改原始数组。这就是一个观点的观点。


当然,不言而喻(这就是我这么说的原因),这适用于您可能想要分配或测试的任何其他位模式,而不仅仅是 NaN。


查看完整回答
反对 回复 2023-06-27
  • 1 回答
  • 0 关注
  • 135 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信