2016-04-14 13 views
1

Ich habe eine ndmatrix in numpy (n x n x n), die ich vektorisieren, um meine Daten in einer bestimmten Art und Weise zu probieren, geben Sie mir (1 x n^3).Wie finde ich die Indizes einer vektorisierten Matrix numpy

Ich möchte die einzelnen vektorisierten Indizes nehmen und sie zurück in n-dimensionale Indizes in der Form (n x n x n) konvertieren. Ich bin mir nicht sicher, wie Holper tatsächlich Matrizen vektorisiert.

Kann jemand beraten?

+1

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

+0

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

Antwort

4

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') 
+0

Danke! Und ich habe auf dem Weg etwas über C und Fortran gelernt! – JB1

Verwandte Themen