簡體   English   中英

求帶掩碼元素的numpy ndarray的平均值

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM