numpy矩阵中唯一值的频率计数

时间:2017-04-14 04:49:53

标签: python numpy

我需要计算numpy矩阵中唯一值的频率,所以首先使用我自己的方法如下:

mat = np.matrix([[1, 2], [3, 4],..])
dic = {}
for i in mat:
   for j in i:
      if j in dic:
         dic[j] += 1
      else:
         dic[j] = 0

但是这种方法对于高阶矩阵来说是昂贵的,例如1000X1000的时间,所以为了减少我试图使用numpy.bincount但我得到ValueError的时间。 有没有更好的方法来获得矩阵中值的频率计数?提前感谢。

3 个答案:

答案 0 :(得分:4)

假设矩阵中的所有值都是非负的,您可以将矩阵转换为numpy数组,然后使用bincount

np.bincount(np.array(mat).reshape(1,mat.size)[0])

答案 1 :(得分:3)

考虑矩阵mat

mat = np.matrix(np.random.randint(10, size=(20, 20)))
print(mat)

[[6 3 5 8 8 2 5 0 7 8 0 0 1 8 7 7 5 6 2 3]
 [0 1 8 0 2 3 6 8 8 5 8 7 3 0 5 1 5 3 8 3]
 [3 8 0 3 5 5 8 1 9 1 0 7 9 4 6 1 8 8 1 8]
 [7 1 3 0 9 1 8 7 0 5 6 7 4 4 8 2 5 8 0 7]
 [9 7 8 4 1 7 3 8 6 1 2 1 6 4 1 2 5 5 9 1]
 [1 2 3 9 4 6 6 6 2 9 9 3 4 3 7 3 0 3 9 4]
 [9 4 0 1 2 7 1 4 2 3 4 1 3 8 4 7 7 2 3 5]
 [4 5 7 0 9 3 9 7 4 2 8 6 1 2 0 7 3 5 9 7]
 [2 0 7 6 3 3 0 0 2 9 1 3 5 8 4 9 1 9 1 1]
 [5 9 9 0 0 9 1 9 6 0 1 7 0 6 7 3 1 2 4 6]
 [0 1 6 8 6 8 6 3 2 9 6 1 2 7 8 4 9 7 2 9]
 [1 4 4 3 6 6 5 9 1 1 1 3 0 4 3 8 0 8 3 4]
 [9 1 5 9 0 6 6 1 6 9 4 8 9 0 6 1 9 6 8 3]
 [3 9 8 1 2 3 3 5 0 1 1 1 0 6 8 9 5 7 4 2]
 [5 5 5 4 6 4 6 0 6 3 5 5 3 4 0 6 8 6 3 6]
 [5 4 9 5 5 6 8 7 0 3 7 2 2 6 0 4 2 8 4 7]
 [5 8 6 3 6 4 8 5 7 6 6 2 3 6 6 8 5 5 4 0]
 [7 0 8 0 2 0 1 9 2 0 9 9 3 0 7 8 4 4 6 4]
 [8 6 0 9 3 1 3 2 5 6 9 1 9 1 3 2 9 1 1 2]
 [9 4 0 6 2 0 4 0 9 7 4 8 7 2 1 5 3 5 3 2]]

您可以将mat转换为numpy数组并使用np.unique,您可以使用return_counts=True参数获取相应唯一值的计数数组

u, c = np.unique(np.array(mat), return_counts=True)

u具有唯一值,c具有计数

print(np.stack([u, c]).T)

[[ 0 43]
 [ 1 46]
 [ 2 33]
 [ 3 45]
 [ 4 37]
 [ 5 36]
 [ 6 45]
 [ 7 33]
 [ 8 41]
 [ 9 41]]

答案 2 :(得分:1)

您是否获得了ValueError: object too deep for desired array np.bincount?它不能处理超过1维的数组("参数:x:array_like,1维,非负整数")

尝试np.bincount(mat.flatten())