[英]Taking mean of numpy ndarray with masked elements
我有一個來自實驗的MxN值數組。 這些值中的一些無效,並設置為0表示這種情況。 我可以使用構造一個有效/無效值的掩碼
mask = (mat1 == 0) & (mat2 == 0)
產生一個MxN的布爾數組。 應該注意的是,被遮罩的位置並不能整齊地跟隨矩陣的行或列-因此,簡單地裁剪矩陣不是一種選擇。
現在,我想沿數組的一個軸取平均值(EG以1xN數組結尾),同時在平均值計算中排除那些無效值。 憑直覺我以為
np.mean(mat1[mask],axis=1)
應該做到這一點,但是mat1[mask]
操作會生成一維數組,該數組似乎只是mask
為true的元素-當我只想在數組的一個維度上求平均值時,這無濟於事。
有沒有一種“ python式”或numpy的方式來做到這一點? 我想我可以使用遮罩將遮罩的元素設置為NaN
並使用np.nanmean
但這仍然有點笨拙。 有沒有辦法做到“干凈”?
我認為做到這一點的最佳方法是遵循以下原則:
masked = np.ma.masked_where(mat1 == 0 && mat2 == 0, array_to_mask)
然后取平均值
masked.mean(axis=1)
一種類似的笨拙但有效的方法是將數組與掩碼相乘,將掩碼值設置為零。 然后,您當然必須手動除以非掩碼值的數量。 因此笨拙。 但是,這將適用於整數數組,關於nan
情況,這還不能說。 對於小型和大型陣列,這似乎也是最快的(在另一個答案中包括掩碼陣列解決方案):
import numpy as np
def nanny(mat, mask):
mat = mat.astype(float).copy() # don't mutate the original
mat[~mask] = np.nan # mask values
return np.nanmean(mat, axis=0) # compute mean
def manual(mat, mask):
# zero masked values, divide by number of nonzeros
return (mat*mask).sum(axis=0)/mask.sum(axis=0)
# set up dummy data for testing
N,M = 400,400
mat1 = np.random.randint(0,N,(N,M))
mask = np.random.randint(0,2,(N,M)).astype(bool)
print(np.array_equal(nanny(mat1, mask), manual(mat1, mask))) # True
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.