计算数组中唯一数组的出现次数

时间:2017-07-18 20:22:18

标签: python numpy counter

我有一个不同的热编码numpy数组的numpy数组,例如;

x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])

我想计算每个独特的热矢量的出现,

{[1, 0, 0]: 2, [0, 0, 1]: 1}

5 个答案:

答案 0 :(得分:10)

方法#1

似乎是一个完美的设置,可以使用numpy.unique(v1.13和更新版本)的新功能,让我们沿着NumPy数组的轴工作 -

unq_rows, count = np.unique(x,axis=0, return_counts=1)
out = {tuple(i):j for i,j in zip(unq_rows,count)}

示例输出 -

In [289]: unq_rows
Out[289]: 
array([[0, 0, 1],
       [1, 0, 0]])

In [290]: count
Out[290]: array([1, 2])

In [291]: {tuple(i):j for i,j in zip(unq_rows,count)}
Out[291]: {(0, 0, 1): 1, (1, 0, 0): 2}

方法#2

对于早于v1.13的NumPy版本,我们可以利用输入数组是单热编码数组的事实,就像这样 -

_, idx, count = np.unique(x.argmax(1), return_counts=1, return_index=1)
out = {tuple(i):j for i,j in zip(x[idx],count)} # x[idx] is unq_rows

答案 1 :(得分:3)

您可以将数组转换为元组并使用Counter

import numpy as np
from collections import Counter
x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
Counter([tuple(a) for a in x])
# Counter({(1, 0, 0): 2, (0, 0, 1): 1})

答案 2 :(得分:3)

给定数据格式的最快方法是:

x.sum(axis=0)

给出:

array([2, 0, 1])

第一个结果是第一个热点阵列的数量:

[1, 0, 0] [2
[0, 1, 0]  0
[0, 0, 1]  1]

这利用了一次只能打开一个的事实,因此我们可以分解直接总和。

如果您绝对需要将其扩展为相同的格式,可以通过以下方式进行转换:

sums = x.sum(axis=0)
{tuple(int(k == i) for k in range(len(sums))): e for i, e in enumerate(sums)}

或者,类似于tarashypka:

{tuple(row): count for row, count in zip(np.eye(len(sums), dtype=np.int64), sums)}

的产率:

{(1, 0, 0): 2, (0, 1, 0): 0, (0, 0, 1): 1}

答案 3 :(得分:2)

以下是sum

的另一个有趣的解决方案
>> {tuple(v): n for v, n in zip(np.eye(x.shape[1], dtype=int), np.sum(x, axis=0)) 
                if n > 0}
{(0, 0, 1): 1, (1, 0, 0): 2}

答案 4 :(得分:1)

列表(包括numpy数组)是不可删除的,即它们不能是字典的键。因此,您的精确所需输出,在Python中永远不可能使用看起来像[1, 0, 0]的字典。要处理这个问题,你需要将你的向量映射到元组。

from collections import Counter
import numpy as np

x = np.array([[1, 0, 0], [0, 0, 1], [1, 0, 0]])
counts = Counter(map(tuple, x))

那会得到你:

In [12]: counts
Out[12]: Counter({(0, 0, 1): 1, (1, 0, 0): 2})