【问题标题】:Count how often integer y occurs right after integer x in a numpy array计算整数 y 在 numpy 数组中的整数 x 之后出现的频率
【发布时间】:2017-02-27 17:42:40
【问题描述】:

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

我想计算,对于[0, 31](例如[0, 1], [7, 9], [18, 0])范围内的每对整数(a, b)ba 之后出现的频率。 p>

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

我正在寻找一种使用 numpy 执行此操作的有效方法。原始 python 循环太慢了。

【问题讨论】:

    标签: python numpy count frequency


    【解决方案1】:

    这是一种方法...

    为了使示例更易于阅读,我将使用最大值 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 函数实际上是如何工作的,以了解正在发生的事情!
    【解决方案2】:

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

    如果你的数组是多维的,你需要先把它展平或者对上面的代码做一些小的修改。

    【讨论】:

    • 感谢您的回答 :) 尽管您的解决方案很优雅,但它实际上比原始 python 循环慢。
    猜你喜欢
    • 1970-01-01
    • 2021-10-30
    • 2012-02-12
    • 1970-01-01
    • 2021-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多