3

我有一个可行的解决方案来解决我的问题,但是当我尝试不同的事情时,我很惊讶没有找到更好的解决方案。这一切都归结为创建一个灵活的 dtype 值,用于比较和插入数组。

我有一个 RGB 24 位图像(因此每个 R、G 和 B 为 8 位)图像阵列。事实证明,对于某些操作,最好将其用作具有 HxWx3 的 3D 数组,其他时候最好将其用作具有 dtype([('R',uint8),('G',uint8) 的结构化数组,('B',uint8)])。一个例子是尝试重新标记图像颜色,以便为每种唯一颜色赋予不同的值。我使用以下代码执行此操作:

# 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). 对于其他值,这确实不起作用,例如插入(1, 2, 3)实际 inserts (1, 1, 1), (2, 2, 2), (3, 3, 3)

那么到底有没有更好的方法呢?谢谢!

4

1 回答 1

1

我可以insert()为您的案例做工作(请注意,而不是0使用它[0]):

values = insert(values, [0], (1,2,3))

给予(例如):

array([(0, 1, 3), (0, 0, 0), (0, 0, 4), ..., (255, 255, 251), (255, 255, 253), (255, 255, 255)],
       dtype=[('R', 'u1'), ('G', 'u1'), ('B', 'u1')])

关于做你的另一种方式if,你可以这样做:

str(values[0]) == str((0,0,0))

或者,也许更健壮:

eval(str(values[0])) == eval(str(0,0,0))
于 2013-06-05T18:44:30.437 回答