2 Stimmen

Wie man eine Funktion auf jede 3. Achse Element in einem Numpy-Array anwenden?

Wenn ich ein Numpy-Array wie folgt habe:

[[[137 153 135]
  [138 154 136]
  [138 153 138]
  ..., 
  [134 159 153]
  [136 159 153]
  [135 158 152]]
  ...,
  [ 57  44  34]
  [ 55  47  37]
  [ 55  47  37]]]

Wie kann ich eine Funktion auf jeden [000 000 000]-Eintrag anwenden und ihn verändern?

# a = numpy array
for x in a:
    for y in x:
        y = modify(y)

Was ich erreichen möchte, ist die Änderung jedes (r,g,b) Pixel in einem PIL-Bild, das in ein Numpy-Array konvertiert wurde.

5voto

Sven Marnach Punkte 525472

Eine einfache Antwort auf Ihre Frage lautet

for row in a:
    for item in row:
        item[:] = modify(item)

Das wird allerdings nicht sehr effizient sein. Eine effiziente Lösung sollte Python-Schleifen über alle Pixel vermeiden. (Das ist irgendwie das, worum es bei NumPy geht - vektorisieren Sie Ihren Code!) Eine vektorisierte Version für den vorliegenden Fall wäre

r, g, b = a[..., 0], a[..., 1], a[..., 2]
new_a = numpy.empty_like(a)
new_a.fill(255)
new_a[(r != a.max(axis=2)) | (r <= 125) | (g >= 70) | (b >= 110), 1:] = 0

0voto

Bill Barry Punkte 3231

y Das ist Ihr rgb-Array, nicht wahr?

for row in a:
    for px in row:
        px[0] = 255 - px[0]
        px[1] = 255 - px[1]
        px[2] = 255 - px[2]

oder allgemeiner ausgedrückt:

for row in a:
    for px in row:
        n = modify(px)
        px[0] = n[0]
        px[1] = n[1]
        px[2] = n[2]

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X