2017-12-30 32 views
0

Ich versuche, Werte von 2D-numpy-Array abzubilden, d. H. Um (effizient) über Zeilen zu iterieren und Werte basierend auf Zeilenindex anzufügen.numpy map 2D-Array-Werte

Ein Ansatz, die ich versucht habe, ist:

source = misc.imread(fname) # Load some image 
img = np.array(source, dtype=np.float64)/255 # Cast and normalize values 
w, h, d = tuple(img.shape) # Get dimensions 
img = np.reshape(img, (w * h, d)) # Flatten 3D to 2D 

# The actual problem: 
# Map (R, G, B) pixels to (R, G, B, X, Y) to preserve position 
img_data = ((px[0], px[1], px[2], idx % w, int(idx // w)) for idx, px in enumerate(img)) 
img_data = np.fromiter(img_data, dtype=tuple) # Get back to np.array 

aber die Lösung aufwirft: ValueError: cannot create object arrays from iterator

Kann jemand empfehlen, wie effizient in numpy diese absurden einfache Operation durchzuführen? Ich weiß nicht, wie kompliziert diese Bibliothek ist ... Und warum verbraucht dieser Code ein paar Gigabyte Speicher für 7000x5000 px?

Dank

+0

, warum Sie nicht eine Liste von was auch immer SieFormal zu erzeugen will, und wandle dann alles einfach in 'np array' mit' np.array (img_data) '? – Adorn

Antwort

0

vielleicht np.concatenate und np.indices:

np.concatenate((np.arange(40).reshape((4,5,2)), *np.indices((4,5,1))), axis=-1)[:,:,:-1] 
Out[264]: 
array([[[ 0, 1, 0, 0], 
     [ 2, 3, 0, 1], 
     [ 4, 5, 0, 2], 
     [ 6, 7, 0, 3], 
     [ 8, 9, 0, 4]], 

     [[10, 11, 1, 0], 
     [12, 13, 1, 1], 
     [14, 15, 1, 2], 
     [16, 17, 1, 3], 
     [18, 19, 1, 4]], 

     [[20, 21, 2, 0], 
     [22, 23, 2, 1], 
     [24, 25, 2, 2], 
     [26, 27, 2, 3], 
     [28, 29, 2, 4]], 

     [[30, 31, 3, 0], 
     [32, 33, 3, 1], 
     [34, 35, 3, 2], 
     [36, 37, 3, 3], 
     [38, 39, 3, 4]]]) 

die [:,:,:-1] eine 'Extra' 0 Einstiegsleisten, vielleicht ist es eine bessere Art und Weise