【问题标题】:How to get the frequency of a specific value in a numpy array如何获取numpy数组中特定值的频率
【发布时间】:2013-07-23 10:35:05
【问题描述】:

我有一个形状为 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 的频率,但它不会告诉我这一点。矩阵的形状也很奇怪。

如果我尝试 sum with where 也不会给我正确的值:

>>> 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数组中特定数字的单个值获取?

【问题讨论】:

  • 我建议尝试使用一个较小的(手动操作)示例来了解正在发生的事情。

标签: python numpy


【解决方案1】:

您想要简单的number 在您的data 数组中出现的次数?试试

np.bincount(data)[number]

【讨论】:

  • 也是我自己发现的。感谢您的答复!但这需要我首先将矩阵重塑为一维数组。这当然没问题。只要我的电脑必须这样做,而不是我。
【解决方案2】:

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 == 12np.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]),)

显然,对第二个求和不会给你想要的。

【讨论】:

    【解决方案3】:

    您可以使用集合模块中的“计数器”。

    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 2 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 1970-01-01
      • 2018-09-25
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多