如何通过沿数组移动特定大小的窗口将numpy数组划分为n个块

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

我有一个很大的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)

但是对于拥有超过一百万个条目的数组,这是非常慢的,是否有任何技巧可以使其更快?

python arrays pandas numpy bigdata
1个回答
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的有序数字的列表。

© www.soinside.com 2019 - 2024. All rights reserved.