Python 创建灵活数据类型的新numpy数组标量

Python 创建灵活数据类型的新numpy数组标量,python,numpy,Python,Numpy,我的问题有一个有效的解决方案,但当我尝试不同的事情时,我惊讶地发现没有更好的解决方案。这一切归结为创建一个灵活的数据类型值,用于比较和插入数组 我有一个RGB 24位图像(每个R、G和B都有8位)图像阵列。事实证明,对于某些操作,最好将其用作HxWx3的3D数组,其他情况下,最好将其用作具有数据类型([(('R',uint8),('G',uint8),('B',uint8)]的结构化数组。一个例子是,尝试重新标记图像颜色,以便为每个唯一的颜色指定不同的值。我使用以下代码执行此操作: # Give

我的问题有一个有效的解决方案,但当我尝试不同的事情时,我惊讶地发现没有更好的解决方案。这一切归结为创建一个灵活的数据类型值,用于比较和插入数组

我有一个RGB 24位图像(每个R、G和B都有8位)图像阵列。事实证明,对于某些操作,最好将其用作HxWx3的3D数组,其他情况下,最好将其用作具有数据类型([(('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\u dtype.create((0,0,0))

接下来使用insert语句,您需要为
(0,0,0)
插入0。对于其他值,这实际上不起作用,例如插入
(1,2,3)
实际上插入
(1,1,1)、(2,2)、(3,3,3)

那么最后,有没有更好的方法呢?谢谢

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

给予(例如):

关于执行
的另一种方法,如果
,您可以执行以下操作:

str(values[0]) == str((0,0,0))
或者,或许更为稳健:

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

奇怪的是,今天的insert(值,0,(1,2,3))也可以正常工作。我试图重现失败…看起来insert(值,0,(1,2,3))适用于NumPy v1.7.0及更早版本,但从NumPy v1.7.1开始,您需要按照此处建议执行[0]。从NumPy v1.8.0文档开始,提到了这个新特性(v1.8.0中提到了新特性,但我可以看到它实际上是在v1.7.1中引入的),并且他们特别说明了0和[0]之间的区别。谢谢对于比较部分,我使用tuple(值[0])==(0,0,0)。谢谢你的建议!
str(values[0]) == str((0,0,0))
eval(str(values[0])) == eval(str(0,0,0))