相关疑难解决方法(0)

广播的NumPy算法 - 为什么一种方法的性能更高?

这个问题是我以高效的方式计算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)

python performance numpy linear-algebra numpy-broadcasting

15
推荐指数
1
解决办法
446
查看次数

如何避免具有多列的 numpy 数组的总和精度较低

我一直假设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,如果这个起作用的话。

python numpy floating-accuracy ieee-754

5
推荐指数
1
解决办法
1147
查看次数