2013-08-21 7 views
10

Ich möchte ein 2D numpy Array schaffen, wo I die Koordinaten der Bildpunkte, so daß numpy Array gespeichert werden sollen, wie diesschnellste Methode 2D numpy Array, dessen Elemente in Reihe erstellen

[(0, 0), (0, 1), (0, 2), ...., (0, 510), (0, 511) 
(1, 0), (1, 1), (1, 2), ...., (1, 510), (1, 511) 
.. 
.. 
.. 
(511, 0), (511, 1), (511, 2), ...., (511, 510), (511, 511)] 

Das sieht a ist lächerliche Frage, aber ich konnte noch nichts finden.

+0

Wie Sie es formatiert haben, sieht es so aus, als ob Sie ein 3D-Array mit Form (512, 512, 2) möchten ... aber das syntaktische Markup ist für ein 2D-Array mit Form (512 * 512, 2). Könnten Sie das klären? – lmjohns3

Antwort

7

Kann np.indices oder np.meshgrid für erweiterte Indizierung verwenden:

>>> data=np.indices((512,512)).swapaxes(0,2).swapaxes(0,1) 
>>> data.shape 
(512, 512, 2) 

>>> data[5,0] 
array([5, 0]) 
>>> data[5,25] 
array([ 5, 25]) 

Diese seltsam aussehen kann, weil es ist wirklich so etwas wie dies gemacht zu tun:

>>> a=np.ones((3,3)) 
>>> ind=np.indices((2,1)) 
>>> a[ind[0],ind[1]]=0 
>>> a 
array([[ 0., 1., 1.], 
     [ 0., 1., 1.], 
     [ 1., 1., 1.]]) 

A mgrid Beispiel:

np.mgrid[0:512,0:512].swapaxes(0,2).swapaxes(0,1) 

Ein Beispiel für ein Meshgrid:

>>> a=np.arange(0,512) 
>>> x,y=np.meshgrid(a,a) 
>>> ind=np.dstack((y,x)) 
>>> ind.shape 
(512, 512, 2) 

>>> ind[5,0] 
array([5, 0]) 

Alle sind gleichwertige Möglichkeiten, dies zu tun; meshgrid kann jedoch zum Erstellen von nicht gleichmäßigen Gittern verwendet werden.

Wenn es Ihnen nichts ausmacht, Zeilen-/Spaltenindizes zu wechseln, können Sie die endgültige swapaxes(0,1) löschen.

2

Sie können np.ogrid hier verwenden. Anstatt einen tuple zu speichern, speichern Sie ihn in einem 3D-Array.

>>> t_row, t_col = np.ogrid[0:512, 0:512] 
>>> a = np.zeros((512, 512, 2), dtype=np.uint8) 
>>> t_row, t_col = np.ogrid[0:512, 0:512] 
>>> a[t_row, t_col, 0] = t_row 
>>> a[t_row, t_col, 1] = t_col 

Dies sollte den Trick tun. Hoffentlich kannst du das anstelle des Tupels verwenden.

Chintak

3

Das Beispiel in der Frage ist nicht ganz klar - entweder zusätzliche Kommas fehlen oder zusätzliche brakets.

diese eine - Beispiel Bereiche 3, 4 der Übersichtlichkeit halber - liefert die Lösung für die erste Variante und erzeugt ein 2D-Array in Wirkung (wie die Frage Titel andeutet) - „Auflisten“ alle Koordinaten:

>>> np.indices((3,4)).reshape(2,-1).T 
array([[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3], 
     [1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3], 
     [2, 0], 
     [2, 1], 
     [2, 2], 
     [2, 3]]) 

die andere Variante wurde bereits in einer anderen Antwort gezeigt, indem sie 2x .swapaxes() - aber auch mit einer np.rollaxis() (oder den neuen np.moveaxis()) getan werden könnte:

>>> np.rollaxis(np.indices((3,4)), 0, 2+1) 
array([[[0, 0], 
     [0, 1], 
     [0, 2], 
     [0, 3]], 

     [[1, 0], 
     [1, 1], 
     [1, 2], 
     [1, 3]], 

     [[2, 0], 
     [2, 1], 
     [2, 2], 
     [2, 3]]]) 
>>> _[0,1] 
array([0, 1]) 

Diese Methode funktioniert auch das gleiche für N-dimensionalen Indizes, z.B .:

>>> np.rollaxis(np.indices((5,6,7)), 0, 3+1) 

Hinweis: Die Funktion np.indices in die Tat (C-Geschwindigkeit) schnell für große Bereiche arbeitet.

Verwandte Themen