1

長さの異なる numpy 配列のリストがあり、そのうちのいくつかは次のように繰り返されます。

import numpy as np

multi = [np.array([1, 2, 3]),
      np.array([1, 2]),
      np.array([1, 2, 3, 4]),
      np.array([1, 2, 3]),
      np.array([1, 2])]

このリストから、一意の配列の数が必要です (シーケンスのヒストグラムなど)。

numpy 配列はハッシュ可能ではないため、配列を文字列表現に変換し、それをこのメソッドitertools.groupbyと同様のグループ化のキーとして使用することでこれを行っています。

import itertools

sorted_strings = sorted([str(p) for p in multi])
groups = [(k, len(list(g))) for k, g in itertools.groupby(sorted_strings)]
print(groups)

この出力は次のとおりです。

[('[1 2 3 4]', 1), ('[1 2 3]', 2), ('[1 2]', 2)]

これは正しいですが、より洗練された解決策があるかどうか、または配列のリストよりもこのデータを格納するためのより良い方法があるかどうか疑問に思っています。

4

2 に答える 2

2

使用できますcollections.Counter

>>> from collections import Counter
>>> 
>>> Counter(map(tuple, multi)).most_common()
[((1, 2), 2), ((1, 2, 3), 2), ((1, 2, 3, 4), 1)]

最も一般的でないものを取得するには:

>>> Counter(map(tuple, multi)).most_common()[::-1]
[((1, 2, 3, 4), 1), ((1, 2, 3), 2), ((1, 2), 2)]
于 2012-10-26T22:07:18.073 に答える
0

を定義していないバージョンのPythonで立ち往生している場合はcollections.Counter、リンクしたメソッドを使用できます。

 base = sorted(tuple(m) for m in multi)
 G=[(k,len(list(g))) for (k,g) in itertools.groupby(base)]

Counter基本的に、各配列をタプルに変換します( -basedメソッドは同じアプローチに依存していることに注意してください)。

np.array([2,1])配列がソートされていることを確認して、とnp.array([1,2])が同等であると見なされるようにする必要があることに注意してください。

 base = sorted(tuple(sorted(m)) for m in multi)
于 2012-10-29T12:53:10.907 に答える