计算整数y在numpy数组中的整数x之后出现的频率

时间:2017-02-27 17:42:41

标签: python numpy count frequency

我有一个非常大的numpy.array整数,其中每个整数都在[0, 31]范围内。

我想,对于(a, b)范围内的每一对整数[0, 31](例如[0, 1], [7, 9], [18, 0]b发生频率a(32, 32)之后。

这会给我一个a = [1,2,3,4,0,-1,-2,3,4] 计数矩阵。

我正在寻找一种有效的方法来实现numpy。原始的python循环会太慢。

2 个答案:

答案 0 :(得分:2)

这是一种方式......

为了使示例更易于阅读,我将使用最大值9而不是31:

In [178]: maxval = 9

为示例制作一个随机输入:

In [179]: np.random.seed(123)

In [180]: x = np.random.randint(0, maxval+1, size=100)

创建结果,最初全部为0:

In [181]: counts = np.zeros((maxval+1, maxval+1), dtype=int)

现在使用numpy.add.at为每个坐标对添加1,以确保重复计算正确:

In [182]: np.add.at(counts, (x[:-1], x[1:]), 1)

In [183]: counts
Out[183]: 
array([[2, 1, 1, 0, 1, 0, 1, 1, 1, 1],
       [2, 1, 1, 3, 0, 2, 1, 1, 1, 1],
       [0, 2, 1, 1, 4, 0, 2, 0, 0, 0],
       [1, 1, 1, 3, 3, 3, 0, 0, 1, 2],
       [1, 1, 0, 1, 1, 0, 2, 2, 2, 0],
       [1, 0, 0, 0, 0, 0, 1, 1, 0, 2],
       [0, 4, 2, 3, 1, 0, 2, 1, 0, 1],
       [0, 1, 1, 1, 0, 0, 2, 0, 0, 3],
       [1, 2, 0, 1, 0, 0, 1, 0, 0, 0],
       [2, 0, 2, 2, 0, 0, 2, 2, 0, 0]])

例如,次数6后跟1的次数是

In [188]: counts[6, 1]
Out[188]: 4

我们可以使用以下表达式验证:

In [189]: ((x[:-1] == 6) & (x[1:] == 1)).sum()
Out[189]: 4

答案 1 :(得分:0)

您可以将numpy的内置diff例程与布尔数组一起使用。

import numpy as np    

test_array = np.array([1, 2, 3, 1, 2, 4, 5, 1, 2, 6, 7])
a, b = (1, 2)

sum(np.bitwise_and(test_array[:-1] == a, np.diff(test_array) == b - a))
# 3

如果您的阵列是多维的,则需要先将其展平或对上述代码进行一些小修改。