あなたはRGBイメージを持っており、すべてのピクセルを処理したいと想像:numpyの:複数の値のためのベクトル化
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が 配列を平坦化し、 rgb0, rgb1, rgb2, ...
を取得するときに関数がr0, g0, b0, r1, g1, b1, ...
を取得することです。 これは何とかできますか?あらかじめいくつかの特殊なデータ型にnumpyの配列を変換することにより多分
http://docs.scipy.org/doc/numpy/reference/generated/numpy.vectorize.html
?例えば
(もちろん動作していない):
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つ)に分けて、ベクトル化された関数の引数として使用できますか? – jeff7
はいはい!しかし、それがいかに効率的であるかをプロファイリングする必要があります。 – tauran
配列の分離はループよりはるかに高速ですが、larsmansの解決策はまだあります(私は単純なテストで2.7s、0.8s、0.3sを得ました)。しかし、既存の関数(例えば、colorsysモジュールから)を使用したい場合は、まだ興味深いです。 – tauran