math.fsum用于多维数组

问题描述 投票:2回答:2

我有一个维度(i, j)的numpy数组,其中我想加上第一个维度来接收一个形状(j,)数组。通常情况下,我会使用NumPy自己的sum

import numpy

a = numpy.random.rand(100, 77)
numpy.sum(a, axis=0)

但在我的情况下它并没有削减它:有些总和非常恶劣,所以计算结果只有几个正确的数字。

math.fsum非常出色地保留了错误,但它只适用于一维的迭代。 numpy.vectorize也不做这项工作。

如何有效地将math.fsum应用于多维维数?

python arrays numpy
2个回答
2
投票

这个对我来说足够快。

import numpy
import math

a = numpy.random.rand(100, 77)
a = numpy.swapaxes(a, 0, 1)
a = numpy.array([math.fsum(row) for row in a])

希望它是您正在寻找的轴(返回77总和)。


0
投票

查看signature关键字vectorize

_math_fsum_vec = numpy.vectorize(math.fsum, signature='(m)->()')

不幸的是,它比for解决方案慢:

enter image description here

重现情节的代码:

import math
import numpy
import perfplot


_math_fsum_vec = numpy.vectorize(math.fsum, signature='(m)->()')


def fsum_vectorize(a):
    return _math_fsum_vec(a.T).T


def fsum_for(a):
    return numpy.array([math.fsum(row) for row in a.T])


perfplot.save(
    'fsum.png',
    setup=lambda n: numpy.random.rand(n, 100),
    kernels=[fsum_vectorize, fsum_for],
    n_range=[2**k for k in range(12)],
    logx=True,
    logy=True,
    )
© www.soinside.com 2019 - 2024. All rights reserved.