更改大型数组中特定索引处的条目,而无需for循环

时间:2018-09-29 00:15:24

标签: python

我尝试将二维列表中的特定条目设置为自身最大值和另一个值。 在以下示例中,img表示由cv2.imread读取的图像。 msk是相同维的布尔数组。我想将img的所有条目(其中msk为True)设置为value,如果value>特定条目。以下示例始终将其设置为value,即使value小于上一个条目。

img[msk] = value

类似

img[msk] = max(img[msk], value)

不起作用。

用两个for-loop解决它需要更多的时间,因为img代表一个巨大的图像(大约20000x10000 pxls)

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

这是您的问题,我将假设value是一个列表,否则它将不是二维的。

现在将“值”作为列表,您将无法比较max(img(msk),value),因为这两个都是列表,或者如果值不是1,那么如果是这种情况,您可能要指的是max(img[msk])或值是列表max(img[msk]+value)或最终如果value是一个int,max(img[msk]+[value])

P.S我正在做很多事情,因为您不清楚。如果我说错了,请在评论中纠正我。

编辑:根据下面的OP注释,问题类似,您无法执行数组的最大值。这是一个解决方案,不确定迭代是否更昂贵,但不使用它。

先做第一个最大值

img[msk] = value

然后创建第二个最大值,如果尚未被屏蔽并且小于该值,则基本上只有True。

msk2 = img<value

最后应用第二个msk

img[msk2] = value

这里有个例子

import numpy as np
img = np.array([[1,20],[3,4]])
msk = np.array([[True,False],[False,True]])
value = 7
img[msk]= value
# [[7,20],[3,7]]
msk2 = img  < value
img[msk2] = value
#[[7,20],[7,7]]