リスト要素の重複を除く
リストをset()
関数の引数にすると、重複する要素がなくなり全ての要素がユニークになる。
1 2 3 4 5 6 7 8 9 |
import random a = [random.randint(0, 2) for n in range(20)] print(a) print(set(a)) # [2, 2, 2, 2, 1, 0, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 0, 2, 2, 0] # {0, 1, 2} |
ただし結果は集合なので、これをリスト化するにはlist()
関数を使う。
set()
関数の結果、要素は昇順に並んでいるが、hashの計算方法によって必ずしも昇順になると決まってはいない。そこでsorted()
関数でリストをソートしておく(生成されたリストをほかで再利用しないなら、sort()
メソッドを使ってもよい)。
1 2 3 4 5 6 7 8 9 |
import random a = [random.randint(0, 2) for n in range(20)] print(a) print(sorted(list(set(a)))) # [2, 2, 2, 2, 1, 0, 1, 0, 0, 0, 0, 1, 1, 2, 1, 1, 0, 2, 2, 0] # [0, 1, 2] |
ndarrayの要素の重複を除く
元の配列がndarray
で与えられた場合でも、set()
関数を適用すると結果は集合となるが、ndarray
の生成時に引数を集合とすると配列として生成されずに集合のまま。
1 2 3 4 5 6 7 8 9 10 11 12 |
import numpy as np import numpy.random as rnd a = rnd.randint(0, 3, 20) print(a) print(set(a)) print(np.array(set(a))) # [2 2 1 2 2 0 1 1 0 1 0 1 2 1 0 1 0 2 2 0] # {0, 1, 2} # {0, 1, 2} |
そこで、list()
関数でいったん集合をリスト化してからndarray
にする必要がある。
また、要素の昇順を保証するためにnp.array()
関数でソートしておく。生成した配列を再利用しないのであれば、ndarray
のsort()
メソッドを使ってもよい。
1 2 3 4 5 6 7 8 9 10 |
import numpy as np import numpy.random as rnd a = rnd.randint(0, 3, 20) print(a) print(np.array(list(set(a)))) # [2 1 2 0 0 0 2 2 2 1 0 1 0 2 0 0 2 0 2 2] # [0 1 2] |
利用例~クラス値を持つデータの分類
たとえば多数のデータの特性値とクラス区分が配列で与えられた場合、クラスごとにマーカーの形や色を変えてプロットするなど、クラスごとに元のデータを分けて処理したい場合。
以下のようにset()
関数で重複を除いてループ処理できる。
1 2 3 4 5 6 7 8 9 10 11 |
import numpy as np X = np.array(['swallow', 'carp', 'dog', 'horse', 'hawk', 'bonito']) y = np.array([1, 0, 3, 3, 1, 0]) for cls in set(y): print(X[y==cls]) # ['carp' 'bonito'] # ['swallow' 'hawk'] # ['dog' 'horse'] |