我需要计算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的时间。 有没有更好的方法来获得矩阵中值的频率计数?提前感谢。
答案 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())