Как применить функцию к каждому элементу 3-й оси в массиве NumPy? - PullRequest
2 голосов
/ 14 октября 2011

Если у меня есть простой массив, например:

[[[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]]]

Как применить функцию к каждой записи [000 000 000], изменив ее?

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

Что яХотелось бы добиться, чтобы каждый (r, g, b) пиксель изменялся в изображении PIL, которое было преобразовано в массив с нулевыми значениями.

Ответы [ 2 ]

5 голосов
/ 14 октября 2011

Простой ответ на ваш вопрос:

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

Хотя это будет не очень эффективно. Эффективное решение должно избегать петель Python по всем пикселям. (В этом-то и заключается суть NumPy - векторизация вашего кода!) Векторизованная версия для рассматриваемого случая будет

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
0 голосов
/ 14 октября 2011

y есть ваш массив rgb, не так ли?

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

или, в более общем случае:

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