2012-03-16 46 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