假設我有三個陣列
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
任何幫助,將不勝感激!
uj5u.com熱心網友回復:
import numpy as np
a = np.array([1, np.nan])
print(a) # [1, nan]
a = np.nan_to_num(a)
print(a) # [1, 0]
https://numpy.org/doc/stable/reference/generated/numpy.nan_to_num.html
對于inf和-inf
from numpy import inf
avg[avg == inf] = 0
avg[avg == -inf] = 0
uj5u.com熱心網友回復:
您嘗試過的方法都是處理它的有效方法,但您需要稍微改變它們。
- 通過僅計算有效的結果(例如非零)來避免預先除法:
使用您定義的布爾掩碼使生成的陣列(索引后)變為一維陣列。因此,使用它意味著您必須預先分配結果陣列,并使用相同的掩碼分配它。
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 中)的情況下,您可以通過完全避免該計算來獲得一點性能。但總的來說,對我來說似乎付出了很多努力。
- 之后屏蔽無效值:
這里的主要內容是你永遠不應該直接比較,np.nan因為它總是 False。您可以通過查看來自的結果自行檢查np.nan == np.nan。處理這個問題的方法是使用專用np.isnan函式。或者,np.isfinite如果您還想同時捕獲 /-np.inf值,也可以否定該函式。
avg = np.average(C/(A B), axis = 1)
avg[np.isnan(avg)] = 0
# or to include inf
avg[~np.isfinite(avg)] = 0
uj5u.com熱心網友回復:
如果您應該將 inf 值保持為零,請按照此操作
np.divide(a, b, where=b.astype(bool))
uj5u.com熱心網友回復:
這比我想象的要難,因為如果np.mean' 的論點導致空陣列并且'必須是一維的where,它就不起作用。np.averageweights
# these don't work
# >>> np.mean(div, axis=1, where=mask.all(1, keepdims=True))
# RuntimeWarning: Mean of empty slice.
# RuntimeWarning: invalid value encountered in true_divide
# >>> np.average(div, axis=1, weights=mask.all(1, keepdims=True))
# TypeError: 1D weights expected when shapes of a and weights differ.
import numpy as np
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]])
div = np.zeros(C.shape)
AB = A B # avoid repeated summing
mask = AB > 0 # AB != 0 to include all valid divisors
np.divide(C, AB, where=mask, out=div) # out=None won't initialize unused elements
np.mean(div * mask.all(1, keepdims=True), axis = 1)
輸出
array([0.25 , 0. , 0.58333333])
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/490683.html
