【发布时间】:2012-03-30 20:06:13
【问题描述】:
假设您有一个 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)
【问题讨论】:
-
您能否将 3d 数组分成 3 个单独的 1d 数组(每个通道 1 个)并将其用作矢量化函数的参数?
-
可以!但我必须说明它的效率。
-
阵列分离比循环快很多,但 larsmans 解决方案仍然胜过它(我通过简单的测试得到了 2.7s、0.8s 和 0.3s)。但如果您想使用现有功能(例如来自 colorsys 模块),这仍然很有趣。
-
我觉得你需要
np.apply_over_axes
标签: python numpy vectorization