了解 numpy.reshape 的性能行为

问题描述 投票:0回答:1

我遇到一个问题,其中

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 源代码吗?

python numpy numpy-ndarray
1个回答
0
投票

与你的

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

最新问题
© www.soinside.com 2019 - 2024. All rights reserved.