【发布时间】:2022-01-24 16:22:55
【问题描述】:
为什么 numpy.matlib 中的 repmat 函数比 numpy.kron(即 Kronecker 积)重复矩阵块要快得多?
MWE 将是:
test_N = 1000
test_vec = np.random.rand(test_N, 2)
rep_vec = np.matlib.repmat(test_vec, 100, 1)
kron_vec = kron(ones((100,1)), test_vec)
%%timeit
rep_vec = np.matlib.repmat(test_vec, 10, 1)
53.5 µs ± 2.42 µs per loop (mean ± std. dev. of 7 runs, 10000 loops each)
%%timeit
kron_vec = kron(test_vec, ones((10,1)))
1.65 ms ± 228 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
【问题讨论】:
-
两者都是可以检查的python代码。快速浏览一下,
repmat使用了reshape和repeat。kron使用outer(乘法)和concatenate。 -
我不明白为什么
reshape和repeat会比outer和concatenate更有效。我认为这就是重点......此外,即使两者都是我可以检查的 Python 代码,我相信这个问题的答案与 NumPy 如何构建在 C 上有关。 -
np.tile(test_vec,(100,1))更快。 -
test_vec[None,:,:].repeat(100,0).reshape(-1,2)与tile做同样的事情。
标签: python numpy matrix kronecker-product