【问题标题】:Check for numpy array equality with specific NaN检查具有特定 NaN 的 numpy 数组是否相等
【发布时间】:2020-08-28 14:02:30
【问题描述】:

在大多数浮点表示中可能有几种不同类型的 NaN(例如安静的 NaN、信号 NaN 等)。我认为这在 numpy 中也是如此。我有一个 NaN 的特定位表示,用 C 定义并导入到 python 中。我想测试一个数组是否完全包含这个特定的浮点位模式。有什么办法吗?

请注意,我想测试数组是否包含这个特定的 NaN,而不是它是否具有一般的 NaN。

【问题讨论】:

    标签: python numpy nan


    【解决方案1】:

    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 的位模式的元素。此版本将保留形状,因为元素大小相同。

    一个更通用的解决方案是使用字节:

    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。

    【讨论】:

      猜你喜欢
      • 2016-09-13
      • 2014-12-27
      • 2016-07-16
      • 2017-02-08
      • 2020-05-27
      • 1970-01-01
      • 2021-11-15
      • 2013-01-27
      • 1970-01-01
      相关资源
      最近更新 更多