我有一个维度@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)
应用于多个维度的数组?
答案 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
解决方案慢:
重现情节的代码:
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,
)