2016-09-29 65 views
1

這是後How to extract rows from an numpy array based on the content?的相對的問題,我用下面的代碼基於列的內容來分割行:如何從排列的numpy數組中提取數組?

np.split(sorted_a,np.unique(sorted_a[:,1],return_index=True)[1][1:]) 

代碼工作得很好,但後來我試過其他代碼分裂個案(如下),我發現可能有錯誤的結果(如案例#1所示)。

CASE#1 
[[2748309, 246211, 1], 
[2748309, 246211, 2], 
[2747481, 246201, 54]] 
OUTPUT#1 
[] 
[[2748309, 246211, 1], 
[2748309, 246211, 2], 
[2747481, 246201, 54]] 
the result I want 
[[2748309, 246211, 1], 
[2748309, 246211, 2]] 
[[2747481, 246201, 54]] 

我覺得代碼可以成功地只能與小數字,用更少的位數的情況下拆分行,我不知道如何解決問題,在上述情況下#1顯示。所以在這篇文章中,我有兩個小的相關問題:

1.如何拆分其中包含更多數字的行? (如情況1所示)?

2.如何在兩種情況下處理(拆分)數據,包括第二列中具有相同元素的#1行,但第一列中具有相同元素的第一行和#2行不同,但在第二個不同? (也就是說,Python可以同時考慮第一列和第二列中的內容來區分行)

隨時給我建議,謝謝。

更新#1

ravel_multi_index功能可以處理這種整數陣列任務,但如何處理含浮標陣?

回答

1

下面是一個方法考慮對從各行的元素作爲索引的元組 -

# Convert to linear index equivalents 
lidx = np.ravel_multi_index(arr[:,:2].T,arr[:,:2].max(0)+1) 

# Get sorted indices of lidx. Using those get shifting indices. 
# Split along sorted input array along axis=0 using those. 
sidx = lidx.argsort() 
out = np.split(arr[sidx],np.unique(lidx[sidx],return_index=1)[1][1:]) 

採樣運行 -

In [34]: arr 
Out[34]: 
array([[2, 7, 5], 
     [3, 4, 6], 
     [2, 3, 5], 
     [2, 7, 7], 
     [4, 4, 7], 
     [3, 4, 6], 
     [2, 8, 5]]) 

In [35]: out 
Out[35]: 
[array([[2, 3, 5]]), array([[2, 7, 5], 
     [2, 7, 7]]), array([[2, 8, 5]]), array([[3, 4, 6], 
     [3, 4, 6]]), array([[4, 4, 7]])] 

有關轉換元件組作爲索引元組的詳細信息,請參閱this post

+0

謝謝你的建議和詳細的鏈接,ravel_multi_index函數可以用整數處理數組,但我想知道如何做與浮點數組相同的工作,因爲函數似乎只能用整數工作。 – Heinz

+1

@ Heinz在計算'lidx'的第一步中,使用'np.unique(a [:,:2],return_inverse = 1)[1] .reshape(-1,2)'代替'arr [ ,:2]'。 – Divakar

+0

Thx,工作! – Heinz

0

numpy_indexed包(免責聲明:我是它的作者)包含的功能,以有效地執行這些類型的操作:

import numpy_indexed as npi 
npi.group_by(a[:, :2]).split(a) 

它體面的測試覆蓋率,所以ID感到驚訝,如果它絆倒你的看似簡單的測試案件。

+0

謝謝你的答案,我會下載並測試這個numpy_indexed包,但我更喜歡用python和numpy來解決這個問題。無論如何,謝謝。 – Heinz

0

如果我直接適用該分割線到你的陣列我得到你的結果,空數組加上原有

In [136]: np.split(a,np.unique(a[:,1],return_index=True)[1][1:]) 
Out[136]: 
[array([], shape=(0, 3), dtype=int32), 
array([[2748309, 246211,  1], 
     [2748309, 246211,  2], 
     [2747481, 246201,  54]])] 

但是,如果我第一次在第2列的排列,如聯答案指定排序時,得到所需的答案 - 與2個陣列切換

In [141]: sorted_a=a[np.argsort(a[:,1])] 
In [142]: sorted_a 
Out[142]: 
array([[2747481, 246201,  54], 
     [2748309, 246211,  1], 
     [2748309, 246211,  2]]) 
In [143]: np.split(sorted_a,np.unique(sorted_a[:,1],return_index=True)[1][1:]) 
Out[143]: 
[array([[2747481, 246201,  54]]), 
array([[2748309, 246211,  1], 
     [2748309, 246211,  2]])] 
+0

感謝您的回答,但如何處理未排序的輸入數組? – Heinz