这是一种方法...
为了使示例更易于阅读,我将使用最大值 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