gpt4 book ai didi

numpy - 在 numpy 掩码数组上执行乘法时出现溢出警告

转载 作者:行者123 更新时间:2023-12-04 20:15:53 24 4
gpt4 key购买 nike

我有一个应用程序从 netcdf 文件中读取 32 位浮点数据,其中使用了默认的 netcdf 填充值,即 9.96920996839e+36。在应用程序的特定点,对从输入数据创建的 float32 类型掩码数组执行基本缩放(乘法)运算,因此:

x = marr * scale   # or, equivalently, x = ma.multiply(marr,scale)

此操作会引发“乘法中遇到溢出”警告,大概是因为填充值和比例的乘积超过了 32 位浮点数的最大值。已知掩码数组中的其他值很小。那么问题是,为什么 numpy 甚至计算输入数组中屏蔽元素的乘积?这些当然应该被忽略,对吧?

碰巧的是,警告可以被默默忽略,因为输出数组中的相应值仍然被标记为屏蔽。但是,知道这是 numpy 中的错误还是“按设计工作”会很有趣。

下面的代码片段说明了这种行为。
import numpy as np
import numpy.ma as ma
arr = [9.96920996839e+36, 1.123, 2.345, 9.96920996839e+36]
marr = ma.masked_values(np.array(arr, dtype='float32'), 9.96920996839e+36)
x = marr * 128.0

正如所料,如果掩码数组是 float64 类型,则不会出现溢出警告(尽管如果比例因子足够大,可能会出现)。同样,如果填充值较小,警告也会消失,例如-1.0e20,用于 float32 情况。

从表面上看,当使用较大的填充值(非常接近 32 位 f.p. 值的最大值)时,numpy 似乎无法识别掩码值。

TIA,
菲尔

最佳答案

The question then is, why is numpy even computing the product for masked elements in the input array? Surely these should simply be ignored, right?



唉,没有。在当前的实现中,任何操作都应用于 整体数组,然后重新应用掩码。

我知道这听起来适得其反,但它是其他方法的更强大且效率更低的替代方案。最初,将操作仅应用于适当的域会很好,但是该域的计算可能会变得非常棘手( pow 存在一些巨大的问题)。而且,额外的测试会破坏已经很可怜的表现。

最近引入了一种新方法,其中 numpy 函数接受可选参数 where ,这可能会有所帮助......但也有关于直接在 C 级别引入对缺失/忽略值的支持的讨论,这可能是要走的路。

关于numpy - 在 numpy 掩码数组上执行乘法时出现溢出警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12510098/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com