如何解决使用特定的NaN检查numpy数组是否相等
在大多数浮点表示中,可能有几种不同类型的NaN(例如,安静的NaN,发信号的NaN等)。我认为在numpy中也是如此。我有一个NaN的特定位表示形式,用C定义并导入到python中。我想测试一个数组是否完全包含此特定的浮点位模式。有什么办法吗?
请注意,我要测试数组是否包含这个特定的 NaN,而不是通常是否具有NaN。
解决方法
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。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。