这个问题是我以高效的方式计算Vandermonde矩阵的答案 .
这是设置:
x = np.arange(5000) # an integer array
N = 4
Run Code Online (Sandbox Code Playgroud)
现在,我将以两种不同的方式计算Vandermonde矩阵:
m1 = (x ** np.arange(N)[:, None]).T
Run Code Online (Sandbox Code Playgroud)
和,
m2 = x[:, None] ** np.arange(N)
Run Code Online (Sandbox Code Playgroud)
完整性检查:
np.array_equal(m1, m2)
True
Run Code Online (Sandbox Code Playgroud)
这些方法是相同的,但它们的性能不是:
%timeit m1 = (x ** np.arange(N)[:, None]).T
42.7 µs ± 271 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%timeit m2 = x[:, None] ** np.arange(N)
150 µs ± 995 ns per loop (mean ± std. dev. of 7 …Run Code Online (Sandbox Code Playgroud) 我一直假设numpy 使用一种pairwise-summation,它也确保 - 操作的高精度float32:
import numpy as np
N=17*10**6 # float32-precision no longer enough to hold the whole sum
print(np.ones((N,1),dtype=np.float32).sum(axis=0))
# [17000000.], kind of expected
Run Code Online (Sandbox Code Playgroud)
但是,如果矩阵有多于一列,则看起来好像使用了不同的算法:
print(np.ones((N,2),dtype=np.float32).sum(axis=0))
# [16777216. 16777216.] the error is just to big
print(np.ones((2*N,2),dtype=np.float32).sum(axis=0))
# [16777216. 16777216.] error is bigger
Run Code Online (Sandbox Code Playgroud)
可能sum只是天真地将所有值相加。一个迹象是16777216.f+1.0f=16777216.f,例如:
one = np.array([1.], np.float32)
print(np.array([16777215.], np.float32)+one) # 16777216.
print(np.array([16777216.], np.float32)+one) # 16777216. as well
Run Code Online (Sandbox Code Playgroud)
为什么 numpy 不对多列使用成对求和,并且 numpy 是否可以强制对多列使用成对求和?
我的numpy版本是1.14.2,如果这个起作用的话。