如何将整数重新编码为python中的其他值?

时间:2017-05-17 19:37:16

标签: python recode

我很惊讶这个问题还没有被问到。给定一个整数数组

x = np.random.randint(1,4,10)

> array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])

如何(轻松)根据某些系统规则更改所有值,例如

x[x==1] = 5
x[x==2] = 6
x[x==3] = 7

> array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])

规则可能比这更复杂,例如重新编码1=22=1,以便订单发挥作用。

3 个答案:

答案 0 :(得分:2)

虽然其他人可能建议只是使用字典,但我建议使用实际针对此特定行为类型的内容,而不是手动使用字典Python's map函数

map接受一个函数并将其应用于每个输入,并将其结果作为列表返回。因此,您可以将if x == y, return z创建为函数并将map(yourfunction, yourlist)应用于该函数。

thing about map是你可以在任何可迭代的,而不仅仅是你的列表上使用它

普通python版

def numberfunc(x):
    if x == 1:
       return 5

    elif x == 2:
       return 6

    elif x== 3:
       return 7

    else:
        return x

x = [random.randint(1,4) for _ in range(10)]
# array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])

x = map(numberfunc, x)
# array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])

Numpy版本(numpy使用vectorize作为其map

x = np.random.randint(1,4,10)
# array([3, 2, 1, 2, 1, 1, 3, 3, 2, 1])

x = x.vectorize(numberfunc)
# array([6, 5, 6, 7, 5, 5, 6, 5, 7, 6])

此外,如果您的数字地图功能进行了大量的比较(大于此处列出的3),您可以考虑使用python的dict以提高O(1) armortized元素访问时间的性能,例如:

num_dict {1:5, 2:6, 3:7, ...}
def numberfunc(x):
        if x in num_dict:
            return num_dict[x]
        return x

您可能不希望在简单的情况下执行此操作,因为 armortized 了解字典运行时性能和持续开销。 Amortized基本上意味着考虑到您将进行的所有操作,最昂贵的操作的成本将被较便宜的廉价的成本所抵消。字典突变偶尔会很昂贵;从整体上看,与其他数据结构相比,许多字典突变并不昂贵。与数组相比,字典也有更大的索引开销。在一个简单的实现中,you will typically have to iterate over lists given your key to find your value以及更复杂的情况often more guaranteed overhead is involved

答案 1 :(得分:1)

最直接的方法就是迭代数组替换值。

rule = {1: 5, 2: 6, 3: 7}
x = x.vectorize(lambda x: rule[x] if x in rule else x)

答案 2 :(得分:1)

使用map进行转换。 map采用转换函数和输入列表,并输出将该函数系统地应用于所有输入的结果。

例如:

def mapping(i):
    if i == 1:
        return 5
    elif i == 2:
        return 6
    elif i == 3:
        return 7
    return i

print array(map(mapping, [3, 2, 1, 2, 1, 1, 3, 3, 2, 1]))