Python中用numpy/scipy计算数组中唯一元素的有效方法

2024-03-28 20:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个小数组,例如

a = array([[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]])

我想计算数组中每个唯一元素的出现次数。例如,对于上面的数组a,我想知道[0,0,1]出现了1次,[1,1,1]出现了2次,[1,0,1]出现了1次。

我想到的一个办法是:

from collections import defaultdict
d = defaultdict(int)

for elt in a:
  d[elt] += 1

有更好/更有效的方法吗?

谢谢。


Tags: 方法infromimport元素for数组次数
3条回答

如果坚持使用Python 2.7(或3.1)不是问题,而且这两个Python版本中的任何一个对您都是可用的,那么如果坚持使用可散列元素(如元组),那么新的collections.Counter可能对您有帮助:

>>> from collections import Counter
>>> c = Counter([(0,0,1), (1,1,1), (1,1,1), (1,0,1)])
>>> c
Counter({(1, 1, 1): 2, (0, 0, 1): 1, (1, 0, 1): 1})

不过,我还没有对这两种方法进行任何性能测试。

可以按行按字典顺序对数组排序,并查找行更改的点:

In [1]: a = array([[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]])

In [2]: b = a[lexsort(a.T)]

In [3]: b
Out[3]: 
array([[0, 0, 1],
       [1, 0, 1],
       [1, 1, 1],
       [1, 1, 1]])

...


In [5]: (b[1:] - b[:-1]).any(-1)
Out[5]: array([ True,  True, False], dtype=bool)

最后一个数组表示前三行不同,第三行重复两次。

对于1和0数组,可以对值进行编码:

In [6]: bincount(dot(a, array([4,2,1])))
Out[6]: array([0, 1, 0, 0, 0, 1, 0, 2])

也可以使用字典。哪种方法最快取决于实际使用的数组的类型。

对于Python2.6<

import itertools

data_array = [[0, 0, 1], [1, 1, 1], [1, 1, 1], [1, 0, 1]]

dict_ = {}

for list_, count in itertools.groupby(data_array):
    dict_.update({tuple(list_), len(list(count))})

相关问题 更多 >