2012-03-16 105 views
0

我试图获得非常大的数组(len> 1000000)的数据切片(基于数组值)。例子请参阅下一个Python代码我想要在纯Python做:numpy中是否有函数比较类似numpy.where函数的多维数组?

vector=[1,2,3,4,5,6,7,8,9,10] 
start=[1,4,9] # start and end lists have the same length 
end=[2,7,9] 
output=[[]]*len(start) 
for indx1 in range(len(start)): 
    temp=[] 
    for indx2 in range(len(vector)): 
     if ((vector[indx2]>=start[indx1]) and (vector[indx2]<=end[indx1])): 
      temp.append(vector[indx2]) 
     output[indx1]=temp 
print output 

矢量列表中有正常25E + 6的元素,同时开始和结束的名单有像1E6的元素,这就是为什么在纯粹做这个python非常慢。

你知道为什么要用numpy避免for循环来解决这个问题吗?

感谢您的时间

+0

将'vector'排序?如果不是,将它分类会受伤,还是需要保持原始顺序? – 2012-03-16 23:07:20

+0

'start'和'end'定义的间隔是否被排序并且不重叠? – 2012-03-16 23:10:25

+0

矢量的顺序必须保持。 – Memolo 2012-03-16 23:23:05

回答

1

如果矢量进行排序,这应该是相当快:

import numpy as np 
from itertools import izip 

vector = np.array([2.0, 2.24, 3.1, 4.768, 16.8, 16.9,23.5,24.0]) 
start = np.array([3.0,4.5,6.5,15.2]) 
end = np.array([7.3,16.2,17.7,25.8]) 
start_i = vector.searchsorted(start, 'left') 
end_i = vector.searchsorted(end, 'right') 
output = [vector[s:e] for s, e in izip(start_i, end_i)] 
print output 
[array([ 3.1 , 4.768]), array([ 4.768]), array([ 16.8, 16.9]), array([ 16.8, 16.9, 23.5, 24. ])] 

你也可以因此在纯Python类似的东西,它不是那么快,但它不要求numpy:

from bisect import bisect_left, bisect_right 
from itertools import izip 

vector = [2.0, 2.24, 3.1, 4.768, 16.8, 16.9,23.5,24.0] 
start = [3.0,4.5,6.5,15.2] 
end = [7.3,16.2,17.7,25.8] 
se = izip(start, end) 
output = [vector[bisect_left(vector, s):bisect_right(vector, e)] for s, e in se] 
print output 
[[3.1, 4.768], [4.768], [16.8, 16.9], [16.8, 16.9, 23.5, 24.0]] 
+0

不,不应重复向量列表。矢量是:[1,2,3,4,5,6,7,8,9,10]和输出应该是:[[1,2],[4,5,6,7],[9]]当开始时是[1,4,9],结束时是[2,7,9]。 – Memolo 2012-03-17 12:59:48

+0

这是一个更现实的例子:如果矢量为[2.0,2.24,3.1,4.768,16.8,16.9,23.5,24.0],则开始为[3.0,4.5,6.5,15.2],结束为[7.3,16.2,17.7 ,25.8];输出必须是[[2.0,2.24,3.1,4.768],[4.768],[16.8,16.9],[16.8,24.0]]。 – Memolo 2012-03-17 13:16:29

+0

请注意,您给我们的代码不会产生您输出的输出,它会产生:'[[3.1,4.768],[4.768],[16.8,16.9],[16.8,16.9,23.5,24.0]]也在你更实际的例子中,向量被排序。这有很大的不同,我们可以假设矢量总是被排序。这就是我想要解决这个问题的原因。如果你让你需要更清楚的话,我们可以尝试写出一个很好的答案。 – 2012-03-17 15:43:56