2015-05-13 51 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行为相同,但它可能不是您想要的;我怀疑默认行为是一个错误。