2016-01-23 42 views
4

我有一個「鄰居」二維數組,我想根據另一個矩陣(稱爲「半徑」)中的對應行重新排序每行。下面的代碼工作,但它使用了一個for循環在一個numpy數組上,我知道這是不正確的方法。這種重新排序的正確numpy/broadcast解決方案是什麼?Numpy:按行排列另一個數組中的行

neighbors = np.array([[8,7,6], [3,2,1]]) 
radii = np.array([[0.4, 0.2, 0.1], [0.3, 0.9, 0.1]]) 

order = radii.argsort(axis=1) 
for i in range(2): 
    neighbors[i] = neighbors[i,order[i]] 
print(neighbors) 

# Result: 
[[6 7 8] 
[1 3 2]] 

回答

2

在NumPy的你會寫是這樣的:(更一般你會寫第一指數np.arange(order.shape[0])[:, None]代替)

>>> neighbors[np.arange(2)[:, None], order] 
array([[6, 7, 8], 
     [1, 3, 2]]) 

這工作,因爲np.arange(2)[:, None]看起來是這樣的:

array([[0], 
     [1]]) 

和訂單看起來像這樣:

array([[2, 1, 0], 
     [2, 0, 1]]) 

對於花式索引,NumPy將索引每個軸的數組配對。行索引[0]與列索引[2, 1, 0]配對,並按照確定的順序創建新行。同樣對於[1][2, 0, 1]來確定第二行。

+0

非常感謝!我認爲你有一個小小的錯字,把我扔了一分鐘 - 在第一行,我認爲你的最後一頁)應該是] –

+0

你說得很對 - 感謝你指出了這一點! –

相關問題