math.fsum用于多维数组

时间:2018-02-22 09:17:33

标签: python arrays numpy

我有一个维度@Bean @Order(0) public RequestContextListener requestContextListener() { return new RequestContextListener(); } 的numpy数组,我想在其中添加第一个维度以接收形状(i, j)的数组。通常情况下,我会使用NumPy自己的sum

(j,)

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

math.fsum非常适合保留错误,但它仅适用于一维的可迭代。 numpy.vectorize也无法完成这项工作。

如何有效地将import numpy a = numpy.random.rand(100, 77) numpy.sum(a, axis=0) 应用于多个维度的数组?

2 个答案:

答案 0 :(得分: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个总和)。

答案 1 :(得分: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,
    )