【问题标题】:Change array values using lookup table [duplicate]使用查找表更改数组值 [重复]
【发布时间】:2018-12-11 16:57:49
【问题描述】:

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

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

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

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

我的任务是根据查找表对原始数组进行重新分类: 原始数组中的所有零都应变为 1,所有 1 应变为零,所有值 ==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。

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

【问题讨论】:

  • 有一个类似的问题here,他们使用查找表而不是字典
  • 如果a中的值是0、1、2的形式...你可以定义tovals = np.array(1,0,255,3)然后简单地result = tovals[a]
  • This 几乎是同一个问题,只是在这种情况下,缺少的映射用零而不是原样填充。

标签: python arrays numpy matrix lookup


【解决方案1】:

您可以复制在“for”循环中保持不变的数组“a”:

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

【讨论】:

    【解决方案2】:

    我认为这可行:

    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]])
    

    【讨论】:

      【解决方案3】:

      你可以这样做:

      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]]
      

      【讨论】:

        猜你喜欢
        • 2018-03-18
        • 2019-05-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-11-26
        相关资源
        最近更新 更多