私は自分の問題に対する実用的な解決策を持っていますが、別のことを試してみると、私が見つけることができるより良い解決策がなかったことに驚いていました. 要するに、比較して配列に挿入するための単一の柔軟な dtype 値を作成することです。
RGB 24 ビット画像 (R、G、B ごとに 8 ビット) の画像配列があります。一部のアクションでは、HxWx3 で 3D 配列として使用するのが最適であることがわかります。また、dtype([('R',uint8),('G',uint8) で構造化配列として使用するのが最適な場合もあります。 ,('B',uint8)])。1 つの例は、すべての一意の色に異なる値が与えられるように、画像の色を再ラベル付けしようとする場合です。私は次のコードでこれを行います:
# Given im as an array of HxWx3, dtype=uint8
from numpy import dtype, uint8, unique, insert, searchsorted
rgb_dtype = dtype([('R',uint8),('G',uint8),('B',uint8)]))
im = im.view(dtype=rgb_dtype).squeeze() # need squeeze to remove the third dim
values = unique(im)
if tuple(values[0]) != (0, 0, 0):
values = insert(values, 0, 0) # value 0 needs to always be (0, 0, 0)
labels = searchsorted(values, im)
if
これは見事に機能しますが、ステートメントの見栄えを良くしようとしましたが、方法が見つかりませんでした。それでは、まず比較を見てみましょう。
>>> values[0]
(0, 0, 0)
>>> values[0] == 0
False
>>> values[0] == (0, 0, 0)
False
>>> values[0] == array([0, 0, 0])
False
>>> values[0] == array([uint8(0), uint8(0), uint8(0)]).view(dtype=rgb_dtype)[0]
True
>>> values[0] == zeros((), dtype=rgb_dtype)
True
しかし、(0, 0, 0) または (1, 1, 1) 以外の何かが必要で、見た目がばかげていない場合はどうでしょうか? のように、これを構築するためのより簡単な方法があるはずですrgb_dtype.create((0,0,0))
。
次の挿入ステートメントでは、 に 0 を挿入する必要があります(0, 0, 0)
。他の値の場合、これは実際には機能しません。たとえば、insert(1, 2, 3)
は実際に inserts を挿入し(1, 1, 1), (2, 2, 2), (3, 3, 3)
ます。
結局のところ、もっと良い方法はありますか?ありがとう!