Представьте, что у вас есть изображение RGB и вы хотите обработать каждый пиксель:
import numpy as np
image = np.zeros((1024, 1024, 3))
def rgb_to_something(rgb):
pass
vfunc = np.vectorize(rgb_to_something)
vfunc(image)
vfunc
теперь должно получить каждое значение RGB.Проблема в том, что numpy выравнивает массив и функция получает r0, g0, b0, r1, g1, b1, ...
, когда она должна получить rgb0, rgb1, rgb2, ...
.Можно ли это как-то сделать?
http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html
Может быть, предварительно преобразовав массив numpy в какой-то специальный тип данных?
Например (конечно, не работает):
image = image.astype(np.float32)
import ctypes
RGB = ctypes.c_float * 3
image.astype(RGB)
ValueError: shape mismatch: objects cannot be broadcast to a single shape
Обновление: главная цель - эффективность здесь.Не векторизованная версия может выглядеть просто так:
import numpy as np
image = np.zeros((1024, 1024, 3))
shape = image.shape[0:2]
image = image.reshape((-1, 3))
def rgb_to_something((r, g, b)):
return r + g + b
transformed_image = np.array([rgb_to_something(rgb) for rgb in image]).reshape(shape)