使用查找更改数组值 table

Change array values using lookup table

我有一个 numpy 二维整数数组:

a = numpy.array([[1, 1, 2, 2],
                 [0, 1, 2, 2],
                 [1, 3, 2, 3]])

我有一个包含原始值和新值的查找 table(元组列表):

lookup = [(0, 1), 
          (1, 0), 
          (2, 255)]

我的任务是根据查找对原始数组进行重新分类table: 原始数组中的所有零都应该变成一个,所有的都应该变成零,所有值==2应该变成255,其他值应该保持不变。预期结果是:

[[0, 0, 255, 255],
 [1, 0, 255, 255],
 [0, 3, 255, 3]]

我尝试了以下解决方案:

for row in lookup:
    original_value = row[0]
    new_value = row[1]
    a[a == original_value] = new_value

但是,我没有得到想要的结果,上面操作的结果是:

[[0, 0, 255, 255],
 [0, 0, 255, 255],
 [0, 3, 255, 3]]

注意 result[1, 0] 是 0 但应该是 1.

是否有方法(嵌套循环除外)使用我的查找更改原始数组中的值table?

我认为这行得通:

a = np.array([[1, 1, 2, 2],
             [0, 1, 2, 2],
             [1, 3, 2, 3]])
lookup = [(0, 1), 
          (1, 0), 
          (2, 255)]

result = (a == 0) + (a == 2) * 255 + (a != 1) * (a != 0) * (a != 2) * a

您得到以下结果:

 array([[  0,   0, 255, 255],
        [  1,   0, 255, 255],
        [  0,   3, 255,   3]])

您可以复制数组 'a',在 'for' 循环中保持不变:

a = np.array([[1, 1, 2, 2],
             [0, 1, 2, 2],
             [1, 3, 2, 3]])

lookup = [(0, 1), 
          (1, 0), 
          (2, 255)]

a_copy = np.copy(a)

for row in lookup:
    original_value = row[0]
    new_value = row[1]
    a[a_copy == original_value] = new_value

你可以这样做:

import numpy as np

a = np.array([[1, 1, 2, 2],
              [0, 1, 2, 2],
              [1, 3, 2, 3]])
lookup = [(0, 1),
          (1, 0),
          (2, 255)]

lookup = np.asarray(lookup)
replacer = np.arange(a.max() + 1)
replacer[lookup[:, 0]] = lookup[:, 1]
result = replacer[a]
print(result)

输出:

[[  0   0 255 255]
 [  1   0 255 255]
 [  0   3 255   3]]