2015-05-13 90 views
5

我有一個簡單的3D陣列a1,其掩蔽的模擬a2工作:`numpy.mean`:不與屏蔽數組

import numpy 

a1 = numpy.array([[[ 0.00, 0.00, 0.00], 
        [ 0.88, 0.80, 0.78], 
        [ 0.75, 0.78, 0.77]], 

        [[ 0.00, 0.00, 0.00], 
        [ 3.29, 3.29, 3.30], 
        [ 3.27, 3.27, 3.26]], 

        [[ 0.00, 0.00, 0.00], 
        [ 0.41, 0.42, 0.40], 
        [ 0.42, 0.43, 0.41]]]) 


a2 = numpy.ma.masked_equal(a1, 0.) 

我要執行的此陣列沿着多個軸線在一個時間的平均(這是在一個numpy.mean奇特,無證使用axis參數的,例如參見here的示例):

numpy.mean(a1, axis=(0, 1)) 

這是工作正常與a1,但我得到了下面的錯誤與屏蔽數組a2

TypeError: tuple indices must be integers, not tuple 

我也得到了同樣的錯誤與蒙面版本numpy.ma.mean(a2, axis=(0, 1)),或者如果我通過a2[a2.mask]=0揭露的陣列。

我在numpy.mean中爲axis參數使用元組,因爲它實際上不是硬編碼(此命令應用於具有不同維數的陣列,根據該元組進行調整)。

numpy版本1.9.11.9.2遇到的問題。

+0

你能提供一個可剪切和粘貼的例子嗎? – atomh33ls

+0

根據[docs](http://docs.scipy.org/doc/numpy/reference/generated/numpy.mean.html),axis參數預計爲int。傳遞一個元組而不是一個int是什麼? – ypx

+0

你不應該使用['ma'版本的'mean'](http://docs.scipy.org/doc/numpy/reference/generated/numpy.ma.mean.html)來獲得一個掩碼數組參數? – user2357112

回答

5

對於MaskedArray自變量,numpy.mean調用MaskedArray.mean,它不支持元組axis參數。

def mean(a, axis=None): 
    if a.mask is numpy.ma.nomask: 
     return super(numpy.ma.MaskedArray, a).mean(axis=axis) 

    counts = numpy.logical_not(a.mask).sum(axis=axis) 
    if counts.shape: 
     sums = a.filled(0).sum(axis=axis) 
     mask = (counts == 0) 
     return numpy.ma.MaskedArray(data=sums * 1./counts, mask=mask, copy=False) 
    elif counts: 
     # Return scalar, not array 
     return a.filled(0).sum(axis=axis) * 1./counts 
    else: 
     # Masked scalar 
     return numpy.ma.masked 

,或者,如果你願意依靠MaskedArray.sum有一個元組axis(你可能是工作,因爲:您可以通過在做支撐元組axis操作方面重新實現MaskedArray.mean得到正確的行爲您使用的numpy.mean無證行爲),

def mean(a, axis=None): 
    if a.mask is numpy.ma.nomask: 
     return super(numpy.ma.MaskedArray, a).mean(axis=axis) 

    sums = a2.sum(axis=axis) 
    counts = numpy.logical_not(a.mask).sum(axis=axis) 
    result = sums * 1./counts 

,我們正在依靠MaskedArray.sum處理屏蔽。

我只輕微測試過這些功能;在使用它們之前,確保它們實際工作,並編寫一些測試。例如,如果輸出爲0維且沒有屏蔽值,則輸出是0D MaskedArray還是標量取決於輸入掩碼是nomask還是所有False的數組。這與默認的MaskedArray.mean行爲相同,但它可能不是您想要的;我懷疑默認行爲是一個錯誤。