为了账号安全,请及时绑定邮箱和手机立即绑定

创建新的灵活dtype的numpy数组标量

创建新的灵活dtype的numpy数组标量

湖上湖 2021-03-17 18:14:03
我有解决问题的有效解决方案,但是当尝试不同的事情时,我感到惊讶的是,找不到更好的解决方案了。归结为创建一个灵活的dtype值以进行比较并插入到数组中。我有一个RGB 24位图像(每个R,G和B为8位)图像阵列。事实证明,对于某些动作,最好将其用作具有HxWx3的3D数组,而其他时候最好将其用作具有dtype([[''R',uint8),('G',uint8)的结构化数组,('B',uint8)])。一个示例是尝试重新标记图像颜色,以便为每种唯一颜色赋予不同的值。我使用以下代码执行此操作:# Given im as an array of HxWx3, dtype=uint8from numpy import dtype, uint8, unique, insert, searchsortedrgb_dtype = dtype([('R',uint8),('G',uint8),('B',uint8)]))im = im.view(dtype=rgb_dtype).squeeze() # need squeeze to remove the third dimvalues = 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] == 0False>>> 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)实际上是inserts (1, 1, 1), (2, 2, 2), (3, 3, 3)。因此,到底有没有更好的方法?谢谢!
查看完整描述

1 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

我可以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))


查看完整回答
反对 回复 2021-03-30
  • 1 回答
  • 0 关注
  • 142 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信