簡體   English   中英

重新分配 numpy.array()

[英]Reassigning numpy.array()

在下面的代碼中,我可以輕松地將數組['a','b','a','c','b','b','c','a']簡化為二進制數組[0 1 0 1 1 1 1 0]這樣'a' -> 0'b','c' -> 1 如何在不使用forif-else情況下將其轉換為三元數組以便'a' -> 0'b' -> 1'c' -> 2 謝謝。

import numpy as np
x = np.array(['a', 'b', 'a', 'c', 'b', 'b', 'c', 'a'])
y = np.where(x=='a', 0, 1)
print(y)

通過做:

np.where(x == 'a', 0, (np.where(x == 'b', 1, 2)))

請注意,這會將所有既不是“a”也不是“b”的字符更改為 2。我假設您只有一個包含 a、b 和 c 的數組。

一個更具可擴展性的版本是使用轉換字典:

my_dict = {'a':0, 'b':1, 'c':2}
x = np.vectorize(my_dict.get)(x)

output:

[0 1 0 2 1 1 2 0]

另一種方法是:

np.select([x==i for i in ['a','b','c']], np.arange(3))

對於小字典@ypno 的答案會更快。 對於更大的字典,請使用此答案。


時間比較

三元字母表

lst = ['a','b','c']
my_dict = {k: v for v, k in enumerate(lst)}

#@Ehsan's solution1
def m1(x):
  return np.vectorize(my_dict.get)(x)

#@ypno's solution
def m2(x):
  return np.where(x == 'a', 0, (np.where(x == 'b', 1, 2)))

#@SteBog's solution
def m3(x):
  y = np.where(x=='a', 0, x)
  y = np.where(x=='b', 1, y)
  y = np.where(x=='c', 2, y)
  return y.astype(np.integer)

#@Ehsan's solution 2 (also suggested by user3483203 in comments)
def m4(x):
   return np.select([x==i for i in lst], np.arange(len(lst)))

#@juanpa.arrivillaga's solution suggested in comments
def m5(x):
  return np.array([my_dict[i] for i in x.tolist()])

in_ = [np.random.choice(lst, size = n) for n in [10,100,1000,10000,100000]]

在此處輸入圖像描述

對 8 個字母的相同分析

lst = ['a','b','c','d','e','f','g','h']

在此處輸入圖像描述

import numpy as np
x = np.array(['a', 'b', 'a', 'c', 'b', 'b', 'c', 'a'])
y = np.where(x=='a', 0, x)
y = np.where(x=='b', 1, y)
y = np.where(x=='c', 2, y)
print(y)

暫無
暫無

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

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