簡體   English   中英

如何在python中將整數重新編碼為其他值?

[英]How to recode integers to other values in python?

令我驚訝的是這個問題還沒有被問到。 給定整數數組

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 ,以便順序發揮作用。

盡管其他人可能建議使用字典,但我建議使用針對這種特定類型的行為實際制作的東西,而不是手動使用字典( Python的map函數)。

map接受一個函數並將其應用於每個輸入,並將其結果作為列表返回。 因此,您將創建if x == y, return zif x == y, return z作為函數if x == y, return z並對其應用map(yourfunction, yourlist)

關於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)鎧裝元素訪問時間的情況下提高性能,例如:

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

在簡單的情況下,您可能不想這樣做,因為字典運行時性能上的僵化陷阱和持續的開銷。 攤銷基本上意味着將您將要進行的所有操作進行裝甲處理后,最昂貴的操作的成本將被較便宜的操作的便宜性所抵消。 有時字典突變可能會很昂貴; 總體而言,與其他數據結構相比,許多字典變異不會昂貴。 與數組相比,字典還具有更大的索引開銷。 在幼稚的實現中, 您通常必須遍歷列表,以找到所需的鍵來找到您的價值,並且在更復雜的情況下, 通常涉及更多保證的開銷

最直接的方法就是遍歷數組替換值。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM