python - 计算 numpy 列表中项目的精确共现次数

标签 python numpy

我正在尝试找出最快的方法来计算两个值在 numpy 列表中一个接一个地出现的次数。

例如:

列表 = [1, 5, 4, 1, 2, 4, 6, 7, 2, 1, 3, 3, 1, 2] 我想计算值 1 跟随值 2 的次数(反之亦然)

在上面的示例中,答案应该是 1,因为 1 只跟在 2 之后一次。

显然,我可以通过一个简单的 for 循环得出答案,每当项目 i 等于 1 且项目 i-1 时,该循环就会添加到计数器中 等于2,但我觉得一定有更快的方法,

谢谢

最佳答案

你可以使用 np.diff 来做到这一点和 np.where :

import numpy as np

mylist = [1, 5, 4, 1, 2, 4, 6, 7, 2, 1, 3, 3, 1, 2]

# Turn your list into a numpy array
myarray = np.array(mylist)

# find occurences where myarray is 2 and the following element is 2 minus 1
np.sum((myarray[:-1] == 2) & (np.diff(myarray) == -1))

返回 1

大型阵列的计时:

在一个小列表上,迭代方法和 numpy 方法之间的时间差异不会很明显。但是在大型数组上,如下例所示,numpy 的性能要好得多。

import timeit

mylist = np.random.choice(range(0,9), 1000000)

def np_method(mylist = mylist):
    return np.sum((mylist[:-1] == 2) & (np.diff(mylist) == -1))

def zip_loop(a = mylist):
    return len( [1 for i,j in zip(a, a[1:]) if i == 2 and j == 1] )

def for_loop(list1 = mylist):
    count=0
    desired_num=2
    follower_num=1
    for i in range(len(list1)-1):
        if list1[i]==desired_num:
            if list1[i+1]==follower_num:
                count+=1
    return count

>>> timeit.timeit(np_method, number = 100) / 100
0.006748438189970329

>>> timeit.timeit(zip_loop, number = 100) / 100
0.3811768989200209

>>> timeit.timeit(for_loop, number = 100) / 100
0.3774999916599336

关于python - 计算 numpy 列表中项目的精确共现次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51193630/

相关文章:

python - NumPy 将函数应用于与另一个 numpy 数组对应的行组

python - 按第二列排序的列中每组的 cumsum 追加到原始数据框

python - 使用 `with open(...)` 解析 csv 文件时 `pandas` 有什么功能?

python - QComboBox 添加粗体父项

python - 将图像从 float32 转换为 uint8 时,蒙版对象消失

python - 如何将 numpy 2D 数组重新放入 python 列表中

python - 上传图片到google Colab,使用Keras进行分类预测

python - 错误: can't chdir to 'app' when using docker start container

python - yaml 锚定义在 PyYAML 中加载

python - t-SNE 的计算瓶颈是内存复杂度吗?