トークンの配列があり、各トークンはからまでの異なるクラスに対応し1
ていn
ます。各クラスに同じ数のトークンが存在するように、配列/リストのバランスをとる必要がありtokens
ます。の要素を削除してこれを実行したいと思いますtokens
。
以下の例では、トークンの数が最も少ないクラスは、トークンclass 2
のみを持つクラス2
です。したがって、他のクラスの要素もカウントがになるまで削除したいと思い2
ます。
例えば
tokens = array(['a','b','c','d','e','f','g','h','l'])
classes = array([ 1 , 1 , 1 , 1 , 2 , 2 , 3 , 3 , 3])
この例では、クラスは(タスクを明確にするために)昇順でリストされていますが、実際には、クラスは特定の順序ではありません。
例えば
sol = array(['c','d','e','f','g','h'])
または
sol = array(['a','b','e','f','g','h'])
等
明らかに、過剰なクラスで削除する要素を選択できるため、さまざまなソリューションを使用できます(上記のように)。私が取ることができます機能必要tokens
とclasses
し、出力aをsol
。
これがNumPyでそれを行う方法です。これにより、常に各クラスの最初の外観が選択されます。
import numpy as np
def balance(tokens, classes):
# Count appearances of each class
c = np.bincount(classes - 1)
n = c.min()
# Accumulated counts for each class shifted one position
cs = np.roll(np.cumsum(c), 1)
cs[0] = 0
# Compute appearance index for each class
i = np.arange(len(classes)) - cs[classes - 1]
# Mask excessive appearances
m = i < n
# Return corresponding tokens
return tokens[m]
tokens = np.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'l'])
classes = np.array([ 1, 1, 1, 1, 2, 2, 3, 3, 3])
print(balance(tokens, classes))
# ['a' 'b' 'e' 'f' 'g' 'h']
現状では、一部のクラスが完全に欠落している場合(出現の最小数がゼロであるため、ソリューションにクラスが表示されないため)、関数は空の配列を返しますが、必要に応じてそれを適応させることができます。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加