gpt4 book ai didi

python - 取平均值时如何避免在 2d numpy 数组中被零除?

转载 作者:行者123 更新时间:2023-12-05 04:28:25 25 4
gpt4 key购买 nike

假设我有三个数组

A = np.array([[2,2,2],[1,0,0],[1,2,1]])
B = np.array([[2,0,2],[0,1,0],[1,2,1]])
C = np.array([[2,0,1],[0,1,0],[1,1,2]])
A,B,C
(array([[2, 2, 2],
[1, 0, 0],
[1, 2, 1]]),
array([[2, 0, 2],
[0, 1, 0],
[1, 2, 1]]),
array([[2, 0, 1],
[0, 1, 0],
[1, 1, 2]]))

当我取 C/(A+B) 的平均值时,我通过 RunTimeWarning 得到 nan/inf 值。结果数组如下所示。

np.average(C/(A+B), axis = 1)
array([0.25 , nan, 0.58333333])

我想将任何 inf/nan 值更改为 0。

到目前为止我尝试过的是

#doesn't work. ( maybe im doing this wrong..)
mask = A+B >0
np.average(C[mask]/(A[mask]+B[mask]), axis = 1)


#does not work and not an ideal solution.
avg = np.average(C/(A+B), axis = 1)
avg[avg == np.nan] =0

如有任何帮助,我们将不胜感激!

最佳答案

您尝试过的方法都是处理它的有效方法,但您需要稍微改变它们。

  1. 避免预先除法,只计算有效的结果(例如非零):

您定义的 bool 掩码的使用使生成的数组(在索引之后)成为一维的。所以使用这个意味着你必须预先分配结果数组,并使用相同的掩码分配它。

mask = A+B > 0
result = np.zeros_like(A, dtype=np.float32)
result[mask] = C[mask]/(A[mask]+B[mask])

它确实需要单独对第二个维度进行平均,并且还需要将由于零而无法完成除法的元素的不正确结果屏蔽为零。

result = result.mean(axis=1)
result[(~mask).any(axis=1)] = 0

对我来说,主要的好处是避免了 Numpy 的警告,也许在大量零(在 A+B 中)的情况下,您可以通过一起避免该计算来获得一点性能。但总的来说,这对我来说似乎很费力。

  1. 事后屏蔽无效值:

这里的主要内容是你应该永远不要直接与np.nan比较,因为它总是假的。您可以通过查看 np.nan == np.nan 的结果自行检查。处理这个问题的方法是使用专用的 np.isnan 函数。或者,如果您还想同时捕获 +/- np.inf 值,则可以取消 np.isfinite 函数。

avg = np.average(C/(A+B), axis = 1)
avg[np.isnan(avg)] = 0

# or to include inf
avg[~np.isfinite(avg)] = 0

关于python - 取平均值时如何避免在 2d numpy 数组中被零除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72612460/

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