2016-11-27 3 views
1

Ich benutze Pillow, um auf jedes Pixel eines Bildes zuzugreifen und die RGB-Werte durch die Elemente einer Liste zu ersetzen.Python numpy array merging manipulation

Ich denke jedoch, dass diese Methode ziemlich langsam ist, und ich lese, dass ein viel schnellerer Weg es zu tun ist, numme Arrays zu verwenden.

Ich konvertiere das Bild in ein numpy Array mit Form (x, y, 3), aber ich weiß nicht, wie man es mit meiner Liste "merge". Zum Beispiel habe ich eine Liste mit 20 Elementen, also möchte ich die ersten 20 Elemente in meinem Array durch die in meiner Liste ersetzen, ohne die Form meines Arrays zu ändern.

Mein Array sieht wie folgt aus:

[[[121, 222, 222], [1, 1, 1],...]] 

Und ich habe eine Liste wie:

[120, 99, 0, 88, 78, 32, 123,...] 

Die endgültige Array sollte wie folgt aussehen:

[[[120, 99, 0], [88, 78, 32], [123, ..., ...],...]] 

Die Liste ist kürzer als das Array. Wenn die Liste endet, sollten die folgenden Elemente des Arrays unverändert bleiben.

Ich versuchte zu erklären, so gut ich konnte, ist etwas unklar ist, lass es mich wissen.

Vielen Dank im Voraus.

Antwort

1

Mit a als Array und L wie die Liste, können Sie einfach mit np.ravel() eine abgeflachte Ansicht des Arrays erhalten und Werte von L von slicing in zuweisen, wie so -

a.ravel()[:len(L)] = L 

Alternativ wir verwenden könnte np.put das wäre bekommen die abgeflachte Ansicht implizit und ordnen sie für Sie, wie so -

np.put(a, range(len(L)), L) 

Wenn ich wählen muss, würde ich mit t gehen er ravel() Methode, wie es die Notwendigkeit für range durch die Verwendung von slicing stattdessen vermeidet.

Probelauf -

In [51]: a 
Out[51]: 
array([[[91, 18, 74], 
     [49, 92, 93], 
     [42, 38, 41], 
     [27, 24, 69]], 

     [[14, 72, 49], 
     [85, 74, 45], 
     [32, 88, 89], 
     [12, 85, 60]]]) 

In [52]: L = [120, 99, 0, 88, 78, 32, 123] 

In [53]: a.ravel()[:len(L)] = L 

In [54]: a 
Out[54]: 
array([[[120, 99, 0], 
     [ 88, 78, 32], 
     [123, 38, 41], 
     [ 27, 24, 69]], 

     [[ 14, 72, 49], 
     [ 85, 74, 45], 
     [ 32, 88, 89], 
     [ 12, 85, 60]]]) 
+0

Danke, das funktioniert. In meinem Fall werden die Elemente der Liste jedoch erzeugt, indem bitweise Operationen an den Elementen des Arrays ausgeführt werden. Insbesondere habe ich eine Liste mit Bits, und ich möchte jedes Element des Arrays ändern, um das Bit in der Liste als LSB zu haben. –

+0

@FrancescoCarzaniga Wichtige Bits wie diese sollten in der Frage im Vorfeld erwähnt werden. Hoffentlich würden Sie das in Ihren zukünftigen Fragen berücksichtigen.Im Moment bearbeiten Sie bitte die Frage mit diesen Details und zeigen uns freundlicherweise mehr geeignete/repräsentative Beispieleingaben und erwartete Ergebnisse. – Divakar

+0

Ja, es stimmt, es tut mir leid, aber dank Ihrer Antwort habe ich eine Lösung für mein spezifisches Problem gefunden. Danke dir nochmal! –

0

Eine sehr einfache Lösung ist Liste Verständnis zu verwenden. Werfen Sie einen Blick auf diese:

lst Unter der Annahme, ist die Liste

lst = [120, 99, 0, 88, 78, 32, 123, 1, 2] 
np.array([lst[x:x+3] for x in range(0, len(lst), 3)]) 

Ausgang:

array([[120, 99, 0], 
     [ 88, 78, 32], 
     [123, 1, 2]])