我有一个形状为1001,2663的numpy数组。数组包含12和127的值,现在我想计算一个特定值的数量,在这种情况下为12.所以我尝试使用bincount,但那是做得很奇怪看看我得到了什么:
>>> x.shape
(1001, 2663)
>>> np.bincount(x)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: object too deep for desired array
>>> y = np.reshape(x, 2665663)
>>> y.shape
(2665663,)
>>> np.bincount(y)
array([ 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 529750, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0,
0, 2135913])
>>> np.nonzero(np.bincount(y))
(array([ 12, 127]),)
值529750可能是值12和2135913的频率可能是值127的频率,但它不会告诉我这一点。矩阵的形状也很奇怪。
如果我尝试总结的地方也不会给我正确的价值:
>>> np.sum(np.where(x==12))
907804649
我没有选择:尊重SO的声望,如何在numpy矩阵中获取特定值的频率?
修改
较小的例子。但仍然得到我不太懂的结果。为什么零?
>>> m = np.array([[1,1,2],[2,1,1],[2,1,2]])
>>> np.bincount(m)
Traceback (most recent call last):
File "<interactive input>", line 1, in <module>
ValueError: object too deep for desired array
>>> n = np.reshape(m, 9)
>>> n
array([1, 1, 2, 2, 1, 1, 2, 1, 2])
>>> np.bincount(n)
array([0, 5, 4])
我想我明白了。 [0,5,4]中的零表示矩阵中没有0值。所以在我的实际情况中,529750是矩阵中的第12个值,矩阵值0-11都是'0',而不是得到0个值(值13-126),然后值127给出2135913的频率。但是如何在numpy数组中将频率作为特定数字的单个值?
答案 0 :(得分:2)
您想要number
数组中出现简单data
的次数吗?尝试
np.bincount(data)[number]
答案 1 :(得分:1)
bincount
会返回x
的频率为bincount[x]
的数组,它需要一个平面输入,因此您可以使用bincount(array.ravel())
来处理array
时的情况可能不平坦。
如果你的数组只有一些唯一值,即2和127,那么在调用bincount之前使用unique减少数组可能是值得的,即:
import numpy as np
def frequency(array):
values, array = np.unique(array, return_inverse=True)
return values, bincount(array.ravel())
array = np.array([[2, 2, 2],
[127, 127, 127],
[2, 2, 2]])
frequency(array)
# array([ 2, 127]), array([6, 3])
最后你可以做到
np.sum(array == 12)
请注意array == 12
和np.where(array == 12)
:
array = np.array([12, 0, 0, 12])
array == 12
# array([ True, False, False, True], dtype=bool)
np.where(array == 12)
#(array([0, 3]),)
显然,对第二部分的总结不会给你你想要的东西。
答案 2 :(得分:0)
您可以使用集合模块中的“计数器”。
from collections import Counter
import numpy as np
my_array=np.asarray(10*np.random.random((10,10)),'int')
my_dict=Counter()
print '\n The Original array \n ', my_array
for i in my_array:
my_dict=my_dict+Counter(i)
print '\n The Counts \n', my_dict
O / P就像这样
原始阵列 [[6 8 3 7 6 9 2 2 3 2] [7 0 1 1 8 0 8 2 6 3] [0 4 0 1 8 7 6 1 1 1] [9 2 9 2 5 9 9 6 6 7] [5 1 1 0 3 0 2 7 6 2] [6 5 9 6 4 7 5 4 8 0] [7 0 8 7 1 8 5 1 3 2] [6 7 7 0 8 3 6 5 6 6] [0 7 1 6 1 7 8 4 1] [0 8 6 7 1 7 3 3 8 8]]
计数 柜台({6:15,1:14,7:14,8:12,0:11,2:10,3:8,5:6,9:6,4:4})
您可以尝试 most_common()方法,该方法提供最常见的条目 如果您希望特定元素的出现就像字典一样访问。
示例: my_dict [6] 会为上述代码提供 15