Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 计算整数y在numpy数组中紧跟在整数x之后出现的频率_Python_Numpy_Count_Frequency - Fatal编程技术网

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

Python 计算整数y在numpy数组中紧跟在整数x之后出现的频率,python,numpy,count,frequency,Python,Numpy,Count,Frequency,我有一个非常大的numpy.array,其中每个整数都在[0,31]范围内 我想对[0,31]范围内的每一对整数(a,b)(例如[0,1],[7,9],[18,0])计数b在a之后发生的频率 这将给我一个计数矩阵(32,32) 我正在寻找一种有效的方法来使用numpy。原始python循环太慢。您可以将numpy内置的diff例程与布尔数组一起使用 import numpy as np test_array = np.array([1, 2, 3, 1, 2, 4, 5, 1, 2,

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

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

这将给我一个计数矩阵
(32,32)


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

您可以将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

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

您可以将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
如果您的数组是多维的,则需要先将其展平或对上面的代码进行一些小的修改。

这里有一种方法

为了使示例更易于阅读,我将使用最大值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)
现在为每个坐标对添加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
这里有一个方法

为了使示例更易于阅读,我将使用最大值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)
现在为每个坐标对添加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

感谢您的回答:)尽管您的解决方案很优雅,但实际上比原始python循环慢。感谢您的回答:)尽管您的解决方案很优雅,但实际上比原始python循环慢。这是一个非常优雅的解决方案。虽然我需要研究这个numpy函数实际上是如何工作的,以了解发生了什么!这是一个非常优雅的解决方案。虽然我需要研究这个numpy函数实际上是如何工作的,以了解发生了什么!