使用Numpy将一个数组中的值替换为另一个数组中的相应值

2024-04-28 18:12:25 发布

您现在位置:Python中文网/ 问答频道 /正文

以前可能有人问过这个问题,但我什么也找不到。有没有一种有效的方法可以有条件地将一个数组中的项替换为另一个数组中的项

例如,假设我有两个图像(3d阵列-(x,y,3))。 假设我想用第二个数组中的像素值替换第一个数组中的像素值,只要它不是给定值

基本上是这样的,但如果可能,使用更高效的numpy代码:

for i in range(y):    
  for j in range(x):
    if not np.array_equal(arr2[i,j], some_given_rgb_trio):
      arr1[i,j] = arr2[i,j]

顺便说一句,我明白这是一个非常愚蠢和低效的方式去做。但我并不太熟悉通过numpy和python提供给我的所有内容。如果这是个糟糕的问题,我道歉

编辑:该操作与屏蔽时的操作非常相似,但我似乎无法在np.ma模块中找到我需要的内容。当我通过一些条件得到这个掩码时,我基本上想用另一个数组的值替换一个数组中的值,其中我的掩码为true

创建遮罩将非常简单:

mask = np.getmask(np.ma.masked_equal(arr2, some_given_rgb_trio))
arr1[mask == False] = ?? #Should be the corresponding value in arr2

我可以得到遮罩,但我不知道如何再应用它,以所需的方式实际覆盖图像


Tags: in图像numpyfortrionprangesome
2条回答

您可以尝试使用代表变量的所有像素生成rgb图像,然后再次检查整个阵列arr1。检查以下示例:

some_given_rgb_trio = [91, 98, 101]
rbg_image = np.zeros_like(arr1)

for i, v in enumerate(some_given_rgb_trio):
    rbg_image[:, :, i] = v

arr1 = np.where(arr1 != rbg_image, arr2, arr1)

在这种情况下,当条件arr1!=rgb_图像为真,来自arr1的值为假

np.在哪里可以工作:

arr1 = np.where(arr1 == some_given_rgb_trio, arr1, arr2)

渐变图像示例:

a = np.linspace(0, 255, 256*256*3).reshape(256,256,3).astype(np.uint8)
b = np.rot90(a,1)

c = np.where(a < (50,50,50), a, b) 

plt.imshow(c)
plt.show()

相关问题 更多 >