计算 numpy 数组中整数 y 在整数 x 之后出现的频率
Count how often integer y occurs right after integer x in a numpy array
我有一个非常大的 numpy.array
整数,其中每个整数都在 [0, 31]
.
范围内
我想计算,对于[0, 31]
范围内的每对整数(a, b)
(例如[0, 1], [7, 9], [18, 0]
),[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
如果您的数组是多维的,您需要先将其展平或对上面的代码进行一些小的修改。
这是一种方法...
为了使示例更易于阅读,我将使用最大值 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,使用 numpy.add.at
确保正确计算重复项:
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
我有一个非常大的 numpy.array
整数,其中每个整数都在 [0, 31]
.
我想计算,对于[0, 31]
范围内的每对整数(a, b)
(例如[0, 1], [7, 9], [18, 0]
),[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
如果您的数组是多维的,您需要先将其展平或对上面的代码进行一些小的修改。
这是一种方法...
为了使示例更易于阅读,我将使用最大值 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,使用 numpy.add.at
确保正确计算重复项:
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