Numpy hat eine Funktion unravel_index
die so ziemlich das tut: Gegeben sei eine Menge von ‚flach‘ Indizes, wird es ein Tupel von Arrays von Indizes in jeder Dimension zurückgeben:
>>> 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))
Sie können dann zip
sie Hol dir deine originalen Indizes.
Beachten Sie jedoch, dass Matrizen als 'Zeilenfolgen' (C-Konvention, 'C'
) oder 'Sequenz von Spalten' (Fortran-Konvention, 'F'
) oder die entsprechende Konvention in höheren Dimensionen dargestellt werden können. Eine typische Abflachung von Matrizen in numpy wird diese Reihenfolge beibehalten, sodass [[1, 2], [3, 4]]
in [1, 2, 3, 4]
(wenn es die C-Reihenfolge hat) oder [1, 3, 2, 4]
(wenn es die F-Reihenfolge hat) abgeflacht werden kann. unravel_index
einen optionalen order
Parameter, wenn Sie die Standardeinstellung ändern möchten (das ‚C‘ ist), so können Sie dies tun:
>>> # 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')
ich denke, es auf dem Weg, um die Ausgabe von '(1 abhängen würde, n^3) 'wird gespeichert, um das gewünschte Ausgabeformat wiederherzustellen. – Divakar
ja das ist mein Problem. Ich benutze einfach nd.reshape, um die Matrix zu vektorisieren, aber ich bin mir nicht sicher, in welcher Reihenfolge sie gespeichert sind. – JB1