2012-03-16 2 views
0

매우 큰 배열 (len> 1000000)에 대해 데이터의 조각 (배열 값을 기반으로)을 얻으려고합니다. 그 이유는 순수에이 일의 시작과 끝리스트는 1E6의 요소를 가지고있는 동안numpy에서 numpy.where와 비슷한 여러 차원의 배열을 비교하는 함수가 numpy에 있습니까?

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 요소가 있습니다 : 나는 순수 파이썬에서 할 노력하고있어에, 예를 들어, 다음 파이썬 코드를 참조하십시오 파이썬은 매우 느립니다.

numpy를 사용하여이 문제를 해결하기 위해 루프를 피하는 이유를 알고 있습니까? 시간에 대한

감사

+0

'벡터'가 정렬됩니까? 그렇지 않다면, 그것을 다 치기 위해 상처를 줄 것인가 아니면 원래의 질서를 유지할 필요가 있는가? –

+0

'start'와'end'에 의해 정의 된 간격은 정렬되고 중첩되지 않을까요? –

+0

벡터의 순서는 유지되어야합니다. – Memolo

답변

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. ])] 

당신도 순수한 파이썬에서 비슷한, 그것은 매우 빨리 아니지만이 필요하지 않습니다 수 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

+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

+0

우리가 준 코드가 여러분이 보낸 결과물을 만들어 내지 못한다는 사실에 주목하십시오.'[[3.1, 4.768], [4.768], [16.8, 16.9], [16.8, 16.9, 23.5, 24.0] '또한 보다 현실적인 예제에서 벡터가 정렬됩니다. 이것은 큰 차이를 만듭니다. 벡터가 항상 정렬 될 것이라고 가정 할 수 있습니까? 그게 내가이 질문을하기 위해 애쓰는 것입니다. 좀 더 분명하게 필요한 것을 만들면 좋은 대답을 쓰려고 노력할 수 있습니다. –

관련 문제