NumPy でルックアップ テーブル (LUT) を使用して色補間を実装しています。ある時点で、RGB 値の最上位 4 ビットを使用して、17x17x17x4 LUT から対応する CMYK 値を選択しています。現在、次のようになっています。
import numpy as np
rgb = np.random.randint(16, size=(3, 1000, 1000))
lut = np.random.randint(256, size=(17, 17, 17, 4))
cmyk = lut[rgb[0], rgb[1], rgb[2]]
ここで最初の質問が来ます... より良い方法はありませんか? 実際に書き出さなくても、 のインデックスlut
が の軸 0 に沿って格納されていることを NumPy に伝えることができるのは、自然なことのように思えます。NumPyrgb
のようなものはありますか?cmyk = lut.fancier_take(rgb, axis=0)
さらに、 shape の配列が残っている(1000, 1000, 4)
ので、入力と一致させるために、いくつかの を使用して全体を回転させる必要がありますswapaxes
。
cmyk = cmyk.swapaxes(2, 1).swapaxes(1, 0).copy()
また、copy ステートメントも追加する必要があります。そうしないと、結果の配列がメモリ内で連続しておらず、後で問題が発生するためです。
現在、派手なインデックス作成の前に LUT を回転させてから、次の行に沿って何かを行うことに傾いています。
swapped_lut = lut.swapaxes(2, 1).swapaxes(1, 0)
cmyk = swapped_lut[np.arange(4), rgb[0], rgb[1], rgb[2]]
しかし、やはり、それは正しくないように思えます...これを行うには、もっとエレガントな方法が必要ですよね? みたいなcmyk = lut.even_fancier_take(rgb, in_axis=0, out_axis=0)
...