2024-09-26 18:07:13 发布
网友
在大多数浮点表示中,可能存在几种不同类型的NaN(例如,安静NaN、信令NaN等)。我想在努比也是这样。我有一个NaN的特定位表示,用C定义并导入python。我希望测试数组是否完全包含这种特定的浮点位模式。有办法吗
注意,我想测试数组是否包含这个特定的NaN,而不是它通常是否包含NaN
Numpy允许您直接访问阵列中的字节。对于一个简单的情况,您可以直接将NAN视为整数:
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类型:
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
Numpy允许您直接访问阵列中的字节。对于一个简单的情况,您可以直接将NAN视为整数:
现在,您可以比较精确NaN的位模式的元素。此版本将保留形状,因为元素大小相同
一个更通用的解决方案是使用字节,该解决方案允许您使用在大多数系统上没有相应整数模拟的
float128
类型:最后的整形不是严格必要的,但非常方便,因为它将沿最后一个维度隔离原始阵列元素
在这两种情况下,修改视图都会修改原始阵列。这是一个观点
当然,如果不用说(这就是我为什么这么说的原因),这适用于您可能想要分配或测试的任何其他位模式,而不仅仅是NaN
相关问题 更多 >
编程相关推荐