我有一個numpy(n x n x n)的ndmatrix,爲了以特定的方式對我的數據進行一些抽樣,給我(1 x n^3)。如何找到向量化矩陣numpy的索引
我想採取個別矢量化指數,並將其轉換回n維索引形式(n x n x n)。我不知道如何顛簸實際矢量化矩陣。
任何人都可以建議嗎?
我有一個numpy(n x n x n)的ndmatrix,爲了以特定的方式對我的數據進行一些抽樣,給我(1 x n^3)。如何找到向量化矩陣numpy的索引
我想採取個別矢量化指數,並將其轉換回n維索引形式(n x n x n)。我不知道如何顛簸實際矢量化矩陣。
任何人都可以建議嗎?
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')
謝謝!我一路上學習了一些有關C和Fortran慣例的知識! – JB1
我認爲這將取決於這樣的'(1輸出,N^3 )'被存儲以恢復到所需的輸出格式。 – Divakar
是的,這是我的問題。我只是使用nd.reshape來引導矩陣,但我實際上不確定它們以什麼順序存儲 – JB1