首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用元组作为` `axis`‘参数的`numpy.mean`:不处理蒙面数组

用元组作为` `axis`‘参数的`numpy.mean`:不处理蒙面数组
EN

Stack Overflow用户
提问于 2015-05-13 08:32:03
回答 1查看 3.1K关注 0票数 5

我有一个简单的三维阵列a1和它的蒙面模拟a2

代码语言:javascript
运行
复制
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参数在numpy.mean中的一种奇怪的、无文档化的用法,例如,参见here ):

代码语言:javascript
运行
复制
numpy.mean(a1, axis=(0, 1))

这在a1中运行得很好,但是我在蒙面数组a2中得到了以下错误

代码语言:javascript
运行
复制
TypeError: tuple indices must be integers, not tuple

我在蒙版numpy.ma.mean(a2, axis=(0, 1))中也会得到同样的错误,或者如果我通过a2[a2.mask]=0打开数组的话。

我在numpy.mean中对numpy.mean参数使用元组,因为它实际上不是硬编码的(此命令应用于具有不同维数的数组,根据这些维度,元组是适应的)。

numpy版本1.9.11.9.2遇到的问题。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-28 17:36:08

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

代码语言:javascript
运行
复制
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行为),

代码语言:javascript
运行
复制
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行为相同,但可能不是您想要的;我怀疑默认行为是一个bug。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30209624

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档