2017-03-26 88 views
2

我有一個2d索引數組。多個索引的Numpy數組替換爲不同的矩陣

indices = [[2,4], [6,77], [102,554]] 

現在,我有一個不同的4維陣列,ARR,我想僅與索引陣列中相應的索引中提取的陣列(它是一個數組,因爲它是4維)。它等同於下面的代碼。

for i in range(len(indices)): 
    output[i] = arr[indices[i][0], indices[i][1]] 

但是,我意識到使用顯式for循環會產生緩慢的結果。是否有任何可以使用的內置numpy API?在這一點上,我嘗試使用np.choose,np.put,np.take,但沒有成功獲得我想要的。謝謝!

回答

1

我們需要用索引中的兩列索引到前兩個軸(將其視爲數組)。

因此,簡單地轉換爲陣列和索引,像這樣 -

indices_arr = np.array(indices) 
out = arr[indices_arr[:,0], indices_arr[:,1]] 

或者,我們可以直接提取那些沒有轉換成數組,然後指數 -

d0,d1 = [i[0] for i in indices], [i[1] for i in indices] 
out = arr[d0,d1] 

的另一種方法來提取的元素將轉換爲元組,如下所示 -

​​

如果indices已經是一個數組,跳過轉換過程並在我們有indices_arr的地方使用indices

+0

第一種方法比使用顯式for循環更快嗎? –

+0

@AverageAlgorithmGuy如果你已經有'indices'作爲一個數組,我會用第一種方法去,否則去第二個。 – Divakar

0

嘗試使用numpy數組的take函數。你的代碼應該是這樣的:

outputarray= np.take(arr,indices) 
+0

從[numpy文檔](https://docs.scipy.org/doc/numpy-1.10.0/reference/generated/numpy.take.html):「如果索引不是一維的,輸出也有這些尺寸「。這意味着它將返回'[[arr [indices [0] [0]],arr [indices [0] [1]],...],[arr [indices [1] [0]],arr [indices [1] [1]],...],...]' – KevinOrr