2016-12-08 18 views
0

我有一個浮點值的二維矩陣。我想用這個矩陣來生成另一個相同維度的矩陣,其中每個值都被它在所有值的有序列表中的位置替換。如何使用numpy替換值在有序值列表中的位置?

ADDED

在需要更具體約以相同的數量的情況下的行爲。我想讓相同的數字得到相同的「位置索引」。

+0

添加樣品的情況下? – Divakar

+0

如果您有所有值的有序列表,爲什麼您需要替換原始數組中的值?你不能僅僅從這個列表中創建一個數組嗎?沒有一個例子,你的問題是不清楚的 – EdChum

+0

@EdChum,我想要「位置」而不是「價值」(我編輯了我的問題)。例如,值「3.8」可能是底部的第二個值。所以,我想將它替換爲2(如果從0開始計數,則爲1)。 – Roman

回答

2

我想你想

np.argsort(np.argsort(A.ravel())).reshape(A.shape)+1

,讓你排序數組的每個元素的位置(不是值)。但你的問題不是很清楚。

A=np.random.rand(3,3) 

array([[ 0.64125557, 0.66146481, 0.82042912], 
     [ 0.45543483, 0.868029 , 0.99365448], 
     [ 0.20370261, 0.17365685, 0.13530724]]) 

np.argsort(np.argsort(A.ravel())).reshape(A.shape)+1 

array([[5, 6, 7], 
     [4, 8, 9], 
     [3, 2, 1]], dtype=int32) 

編輯:基於Divakar的解決方案,這確實與重複問過,但對於整形二維數組:

a 
array([[16, 5, 17, 11], 
     [ 0, 18, 19, 6], 
     [18, 1, 5, 10], 
     [ 6, 10, 13, 16]]) 

np.unique(a,return_inverse=1)[1].reshape(a.shape)+1 

array([[ 8, 3, 9, 6], 
     [ 1, 10, 11, 4], 
     [10, 2, 3, 5], 
     [ 4, 5, 7, 8]], dtype=int32) 
+0

謝謝你的回答。我剛剛意識到你的解決方案有一個功能,使它對我來說不是最優的。相同的值將有不同的「位置索引」。如果我在輸入矩陣中有幾次3.0,我希望所有這些元素具有相同的位置索引。 – Roman

+0

@Roman確保使用這些詳細信息編輯問題。也很高興看到一個案例被添加到問題中。 – Divakar

+0

@DanielForsman猜猜我錯了,因爲我假設每行。太好了! – Divakar