繁体   English   中英

与元组一起使用的numpy.mean作为axis参数:不适用于掩码数组

[英]`numpy.mean` used with a tuple as `axis` argument: not working with a masked array

我有一个简单的3D数组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.)

我想一次在多个轴上执行此数组的均值(这是numpy.mean axis参数的一种特殊的,未记录的用法,请参见例如此处的示例):

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.ma.mean(a2, axis=(0, 1))出现相同的错误。

我在numpy.meanaxis参数上使用了一个元组,因为它实际上并未进行硬编码(此命令适用于维数可能完全不同的数组,根据该数组元组会被调整)。

numpy版本1.9.11.9.2遇到问题。

对于MaskedArray参数, numpy.mean调用MaskedArray.mean ,它不支持元组axis参数。 通过在确实支持axis元组的操作方面重新实现MaskedArray.mean ,您可以获得正确的行为:

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未记录行为, numpy.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行为相同,但可能不是您想要的。 我怀疑默认行为是错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM