np.reshape
是瓶颈。我想了解什么情况下它快,什么时候慢。以下代码举例说明了我的问题:
import time
import numpy as np
n = 28
# perm = np.arange(n)[::-1] #very slow
# perm = (np.arange(n)+15)%n #still slow
perm = (np.arange(n)+1)%n #fast
test = np.arange(2**n, dtype = np.complex64)
start_time = time.time()
test = test.reshape(n*[2])
test = np.moveaxis(test, np.arange(n), perm)
test = test.reshape(2**n)
print(time.time()-start_time)
有谁知道在哪里可以找到重塑操作的 C 源代码吗?
与你的
n=28
我得到的时间(与你的结果顺序相似):
In [436]: %%timeit
...: test1 = test.reshape(n*[2])
...: test1 = np.moveaxis(test1, np.arange(n), perm1)
...: test1 = test1.reshape(2**n)
...:
...:
23 s ± 239 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [437]: %%timeit
...: test1 = test.reshape(n*[2])
...: test1 = np.moveaxis(test1, np.arange(n), perm2)
...: test1 = test1.reshape(2**n)
...:
...:
11.5 s ± 22.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [438]: %%timeit
...: test1 = test.reshape(n*[2])
...: test1 = np.moveaxis(test1, np.arange(n), perm3)
...: test1 = test1.reshape(2**n)
...:
...:
719 ms ± 28.2 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
这 3 个排列顺序是:
反转:
perm1
Out[428]:
array([27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11,
10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0])
两个区块交换了
perm2
Out[429]:
array([15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0, 1, 2, 3,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14], dtype=int32)
第一轴移动到末端:
perm3
Out[430]:
array([ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17,
18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 0], dtype=int32)
最后一个
reshape
只是np.ravel()
。
所有情况都会在
view
中产生 moveaxis
,然后在 copy
中产生 ravel
。