`numpy.mean`与元组一起用作`axis`参数:不使用屏蔽数组

时间:2015-05-13 08:32:03

标签: python numpy

我有一个简单的3D数组NSDateComponents *components = [calendar components:units fromDate:[NSDate date]]; [components setDay:1]; self.currentDate = [calendar dateFromComponents:components]; int m = components.month; int y = components.year; int d = components.day; NSDateFormatter *df = [[NSDateFormatter alloc] init]; [df setDateFormat:@"yyyy MM dd"]; NSDate *firstDateOfMonth = [df dateFromString:[NSString stringWithFormat:@"%@ %@ 01",y,m]]; NSDate *firstDateOfYear = [df dateFromString:[NSString stringWithFormat:@"%@ 01 01",y]]; 及其屏蔽的模拟a1

a2

我想一次沿着几个轴执行此数组的平均值(这是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.) axis参数的一个特殊的,未记录的使用,请参阅例如here的示例):

numpy.mean

这对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中使用axis参数的元组,因为它实际上没有硬编码(此命令应用于具有不同维数的数组,根据该数组调整元组)

numpy.mean版本numpy1.9.1遇到问题。

1 个答案:

答案 0 :(得分:5)

对于MaskedArray参数,numpy.mean调用MaskedArray.mean,它不支持元组axis参数。您可以通过在支持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(考虑到您正在使用numpy.mean的未记录行为,您很可能会这样做),< / p>

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