2016-03-04 42 views
1

是否有一種快速的方式獲取argwhere輸出格式的輸出?從argwhere到哪裏?

讓我告訴你,我有一些代碼做:

In [123]: filter = np.where(scores[:,:,:,4,:] > 21000) 

In [124]: filter 
Out[124]: 
(array([ 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 23, 23, 23, 23, 23]), 
array([13, 13, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5]), 
array([0, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2]), 
array([44, 44, 0, 1, 2, 3, 6, 8, 12, 14, 22, 31, 58, 76, 82, 41])) 

In [125]: filter2 = np.argwhere(scores[:,:,:,4,:] > 21000) 

In [126]: filter2 
Out[126]: 
array([[ 2, 13, 0, 44], 
     [ 2, 13, 1, 44], 
     [ 4, 4, 3, 0], 
     [ 4, 4, 3, 1], 
     [ 4, 4, 3, 2], 
     [ 4, 4, 3, 3], 
     [ 4, 4, 3, 6], 
     [ 4, 4, 3, 8], 
     [ 4, 4, 3, 12], 
     [ 4, 4, 3, 14], 
     [ 4, 4, 3, 22], 
     [23, 4, 2, 31], 
     [23, 4, 2, 58], 
     [23, 4, 2, 76], 
     [23, 4, 2, 82], 
     [23, 5, 2, 41]]) 

In [150]: scores[:,:,:,4,:][filter] 
Out[150]: 
array([ 21344., 21344., 24672., 24672., 24672., 24672., 25232., 
     25232., 25232., 25232., 24672., 21152., 21152., 21152., 
     21152., 21344.], dtype=float16) 

In [129]: filter2[np.argsort(scores[:,:,:,4,:][filter])] 
Out[129]: 
array([[23, 4, 2, 31], 
     [23, 4, 2, 58], 
     [23, 4, 2, 76], 
     [23, 4, 2, 82], 
     [ 2, 13, 0, 44], 
     [ 2, 13, 1, 44], 
     [23, 5, 2, 41], 
     [ 4, 4, 3, 0], 
     [ 4, 4, 3, 1], 
     [ 4, 4, 3, 2], 
     [ 4, 4, 3, 3], 
     [ 4, 4, 3, 22], 
     [ 4, 4, 3, 6], 
     [ 4, 4, 3, 8], 
     [ 4, 4, 3, 12], 
     [ 4, 4, 3, 14]]) 

129是我想要的輸出,所以我的代碼工作,但我試圖使它儘可能地快。我應該得到filter2np.array(filter).transpose()?有什麼更好的嗎?

編輯,試圖更清楚地說明:我想要一個索引列表,按它們在應用於數組時返回的值排序。要做到這一點,我需要輸出np.where和np.argwhere,我想知道從一個輸出切換到另一個輸出的最快方式是什麼,或者如果有另一個輸出我的結果。

+0

也許拿一個樣本'分數'並解釋你想要什麼? – Divakar

回答

3

看代碼爲argwhere

return transpose(asanyarray(a).nonzero()) 

where文檔說:

其中(條件,[X,Y]) 如果只有condition給出,返回condition.nonzero()

實際上,兩者都使用a.nonzero()。一個使用它,另一個使用它。

In [933]: x=np.zeros((2,3),int) 
In [934]: x[[0,1,0],[0,1,2]]=1 
In [935]: x 
Out[935]: 
array([[1, 0, 1], 
     [0, 1, 0]]) 

In [936]: x.nonzero() 
Out[936]: (array([0, 0, 1], dtype=int32), array([0, 2, 1], dtype=int32)) 
In [937]: np.where(x) # same as nonzero() 
Out[937]: (array([0, 0, 1], dtype=int32), array([0, 2, 1], dtype=int32)) 
In [938]: np.argwhere(x) 
Out[938]: 
array([[0, 0], 
     [0, 2], 
     [1, 1]], dtype=int32) 
In [939]: np.argwhere(x).T 
Out[939]: 
array([[0, 0, 1], 
     [0, 2, 1]], dtype=int32) 

argwhere().T相同where除了在2D而不是一個元組。

np.transpose(filter)np.array(filter).T看起來同樣好。對於大型陣列,花在nonzero上的時間比花在這些轉換上的時間大得多。