我有一个很大的NumPy数组,我想通过移动特定大小的窗口将其划分为许多子数组,这是我的代码,大小为11的子数组:
T = np.array([])
for i in range(0,len(x)-11):
s = x[i:i+11]
T = np.concatenate((T, s),axis=0)
但是对于拥有超过一百万个条目的数组,这是非常慢的,是否有任何技巧可以使其更快?
我认为您当前的方法无法产生您所描述的内容。这是一种更快的方法,该方法使用列表推导将长数组拆分为许多子数组:
import numpy as np
x = np.arange(10000)
T = np.array([])
T = np.array([np.array(x[i:i+11]) for i in range(len(x)-11)])
sample_1 = '''
import numpy as np
x = np.arange(10000)
T = np.array([])
for i in range(len(x)-11):
s = x[i:i+11]
T = np.concatenate((T, s),axis=0)
'''
sample_2 = '''
import numpy as np
x = np.arange(10000)
T = np.array([])
T = np.array([np.array(x[i:i+11]) for i in range(len(x)-11)])
'''
# Testing the times
import timeit
print(timeit.timeit(sample_1, number=1))
print(timeit.timeit(sample_2, number=1))
5.839815437000652 # Your method
0.11047088200211874 # List Comprehension
我只检查了1次迭代,因为差异非常大,许多迭代不会改变总体结果。
# Your method:
[ 0.00000000e+00 1.00000000e+00 2.00000000e+00 ..., 9.99600000e+03
9.99700000e+03 9.99800000e+03]
# Using List Comprehension:
[[ 0 1 2 ..., 8 9 10]
[ 1 2 3 ..., 9 10 11]
[ 2 3 4 ..., 10 11 12]
...,
[9986 9987 9988 ..., 9994 9995 9996]
[9987 9988 9989 ..., 9995 9996 9997]
[9988 9989 9990 ..., 9996 9997 9998]]
您可以看到,我的方法实际上产生了子数组,这与您提供的代码不同。
这些测试是在x
上进行的,它只是从0到10000的有序数字的列表。