我有一个解决我的问题的工作方案,但是当我尝试不同的事情时,我感到震惊,没有一个更好的解决方案,我能找到。这一切都归结为创建一个灵活的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))
。
接下来使用insert语句,您需要为(0, 0, 0)
插入0。对于其他值,这实际上不起作用,例如插入(1, 2, 3)
实际上插入(1, 1, 1), (2, 2, 2), (3, 3, 3)
。
所以最后,还有更好的方法吗?谢谢!
答案 0 :(得分:1)
我可以让insert()
为您的案例工作(请注意,0
代替[0]
使用{/ 1}}:
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))