[英]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=2
和2=1
,以便順序發揮作用。
盡管其他人可能建議僅使用字典,但我建議使用針對這種特定類型的行為實際制作的東西,而不是手動使用字典( Python的map
函數)。
map
接受一個函數並將其應用於每個輸入,並將其結果作為列表返回。 因此,您將創建if x == y, return z
的if 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.