2016-07-20 83 views
1

我有一個大小爲((s1,... sm))的numpy數組A,其中包含整數項和一個字典D,整數作爲鍵和大小爲((t)的numpy數組)作爲價值觀。我想評估數組A的每個條目上的字典以獲得大小爲((s1,... sm,t))的新數組B.用numpy數組替換numpy數組的條目

例如

D={1:[0,1],2:[1,0]} 
A=np.array([1,2,1]) 

輸出喊是

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

動機:我與單位矢量作爲條目的索引的陣列,並且我需要將其與向量作爲變換成陣列條目。

回答

1

如果可以重命名你的鑰匙是0指數的,你可能會使用直接序列查詢您的單位向量:

>>> units = np.array([D[1], D[2]]) 
>>> B = units[A - 1] # -1 because 0 indexed: 1 -> 0, 2 -> 1 
>>> B 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 

同樣地,對於任何形狀:

>>> A = np.random.random_integers(0, 1, (10, 11, 12)) 
>>> A.shape 
(10, 11, 12) 
>>> B = units[A] 
>>> B.shape 
(10, 11, 12, 2) 

您可以瞭解更多關於在numpy doc

+0

非常優雅 - 謝謝! – fact

0

下面是使用np.searchsorted那些行索引來索引查找到字典的值,然後簡單地編入索引,以獲得所需的輸出,像這樣的做法 -

idx = np.searchsorted(D.keys(),A) 
out = np.asarray(D.values())[idx] 

採樣運行 -

In [45]: A 
Out[45]: array([1, 2, 1]) 

In [46]: D 
Out[46]: {1: [0, 1], 2: [1, 0]} 

In [47]: idx = np.searchsorted(D.keys(),A) 
    ...: out = np.asarray(D.values())[idx] 
    ...: 

In [48]: out 
Out[48]: 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
0
>>> np.asarray([D[key] for key in A]) 
array([[0, 1], 
     [1, 0], 
     [0, 1]]) 
+0

高級索引儘管此代碼可能會幫助解決問題,提供有關_why_額外的內容及/或它如何回答這個問題會顯着提高其長期價值。請[編輯]你的答案,添加一些解釋。 –