3

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)...

4

2 に答える 2

3

tuple行単位のインデックス作成を強制するために使用することをnp.rollaxisお勧めしtransposeますswapaxes

lut[tuple(rgb)].transpose(2, 0, 1).copy()

また

np.rollaxis(lut[tuple(rgb)], 2).copy()

最初に軸を回転す​​るには、次を使用します。

np.rollaxis(lut, -1)[(Ellipsis,) + tuple(rgb)]
于 2012-08-17T23:48:33.903 に答える
1

lutswapがnp.arange(4)機能しない場合は、次の操作を行う必要があります。

swapped_lut = np.rollaxis(lut, -1)
cmyk = swapped_lut[:, rgb[0], rgb[1], rgb[2]].copy()

または、置き換えることができます

cmyk = lut[rgb[0], rgb[1], rgb[2]]
cmyk = cmyk.swapaxes(2, 1).swapaxes(1, 0).copy()

と:

cmyk = lut[tuple(rgb)]
cmyk = np.rollaxis(cmyk, -1).copy()

しかし、すべてを 1 つのステップで実行するには、... たぶん:

rng = np.arange(4).reshape(4, 1, 1)
cmyk = lut[rgb[0], rgb[1], rgb[2], rng]

全然読みにくいですよね?

Numpy multi-dimensional array indexing swaps axis orderという質問への回答を見てください。numpy が複数の配列をブロードキャストして出力サイズを取得する方法をうまく説明しています。ここでは、(4, 1000, 1000) にブロードキャストする lut にインデックスを作成します。それが理にかなっていることを願っています。

于 2012-08-17T23:30:58.250 に答える