2016-04-14 37 views
1

我有一個numpy(n x n x n)的ndmatrix,爲了以特定的方式對我的數據進行一些抽樣,給我(1 x n^3)。如何找到向量化矩陣numpy的索引

我想採取個別矢量化指數,並將其轉換回n維索引形式(n x n x n)。我不知道如何顛簸實際矢量化矩陣。

任何人都可以建議嗎?

+1

我認爲這將取決於這樣的'(1輸出,N^3 )'被存儲以恢復到所需的輸出格式。 – Divakar

+0

是的,這是我的問題。我只是使用nd.reshape來引導矩陣,但我實際上不確定它們以什麼順序存儲 – JB1

回答

4

numpy的具有功能unravel_index這確實相當多的是:給定一組「平」指標,它會在每個維度返回索引列的元組:

>>> indices = np.arange(25, dtype=int) 
>>> np.unravel_index(indices, (5, 5)) 
(array([0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 4, 
     4, 4], dtype=int64), 
array([0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 3, 4, 0, 1, 2, 
     3, 4], dtype=int64)) 

您可以然後將它們zip到得到你的原始指數。但是請注意,矩陣可以表示爲'行的序列'(C約定,'C')或'列的序列'(Fortran約定,'F')或更高維度中的相應約定。 numpy中的矩陣的典型平坦化將保留該順序,因此[[1, 2], [3, 4]]可以平化爲[1, 2, 3, 4](如果它具有'C'順序)或[1, 3, 2, 4](如果它具有'F'順序)。 unravel_index有一個可選的order參數,如果要更改默認的(這是「C」),那麼你可以這樣做:

>>> # Typically, transposition will change the order for 
>>> # efficiency reasons: no need to change the data ! 
>>> n = np.random.random((2, 2, 2)).transpose() 
>>> n.flags.f_contiguous 
True 
>>> n.flags.c_contiguous 
False 
>>> x, y, z = np.unravel_index([1,2,3,7], (2, 2, 2), order='F') 
+0

謝謝!我一路上學習了一些有關C和Fortran慣例的知識! – JB1