我有一个维度(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
应用于多维维数?
这个对我来说足够快。
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总和)。
查看signature
关键字vectorize
。
_math_fsum_vec = numpy.vectorize(math.fsum, signature='(m)->()')
不幸的是,它比for
解决方案慢:
重现情节的代码:
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,
)