首页 > 解决方案 > 在没有 for 循环的情况下更改特定索引处的大型数组中的条目

问题描述

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

img[msk] = value

就像是

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

不起作用。

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

非常感谢你的帮助!

标签: python

解决方案


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

现在将 Value 作为列表,您无法比较max(img(msk),value),因为两者都是列表,或者如果 value 不是,则为 1。如果是这种情况,您可能的意思是max(img[msk])或者 value 是列表max(img[msk]+value),或者最后如果 value 是 int ,max(img[msk]+[value]).

PS我假设很多事情,因为你有点不清楚。如果我说错了,请在评论中纠正我。

编辑:根据下面的 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]]

推荐阅读