首页 > 解决方案 > 有没有办法在 python 中编写快速嵌套循环?

问题描述

我编写了一个函数,它接受一组多个变量并将其与数据帧列表(其中包含 5572 行,存在和不存在这些变量)相匹配,然后计算距离矩阵。

换句话说,我有一个包含 25 个存在/不存在向量的列表(用 0 和一个 1 填充)和一个包含 25 个数据帧的列表(也用 0 和 1 填充)。向量和数据帧按可迭代顺序排列,这意味着 veclist[0] 匹配 PAM[0] 中的列号,依此类推。该函数有一个嵌套循环,外循环按顺序运行数据帧,内循环运行行(查找所有 25 个变量的变量出现在数据帧中的哪一行并给它一个值)

为了更好地说明它,我在下面重新创建了我的数据的简短版本。

向量列表如下所示:

import numpy as np
import pandas as pd
import math

A = np.random.randint(1, size=6).reshape(1, 6)
B = np.random.randint(1, size=11).reshape(1, 11)
A[:,2]=1
B[:,7]=1
vec1 = pd.DataFrame(A, columns=["a","b","c","d","e","f"])
vec2 = pd.DataFrame(B, columns=["a","b","c","d","e","f","g","h","i","j","k"])
veclist=[vec1,vec2]
print(veclist[0])

数据框列表如下所示:

A2 = np.random.randint(2, size=600).reshape(100,6)
B2 = np.random.randint(2, size=1100).reshape(100,11)
df1 = pd.DataFrame(A2, columns=["a","b","c","d","e","f"])
df2 = pd.DataFrame(B2, columns=["a","b","c","d","e","f","g","h","i","j","k"])
dflist=[df1,df2]
print(dflist[0])

这是我编写的函数的代码。

def find_distance(veclist,dflist):
    ncol=len(dflist)
    nrow=dflist[0].shape[0]
    distance=np.zeros((nrow,ncol))
    for k in range(ncol):
        pres=np.where(veclist[k]==1) #getting matching column (where the vector matches the header)
        PAM=dflist[k]
        for m in range(nrow):
            if (veclist[k].iloc[pres]==1).bool() & (PAM.iloc[m,pres[1]]==1).bool():
                a = 2
            else:
                a = 0

            if (veclist[k].iloc[pres]==1).bool() & (PAM.iloc[m,pres[1]]==0).bool():
                b = 1
            else:
                b = 0

            if (veclist[k].iloc[pres]==0).bool() & (PAM.iloc[m,pres[1]]==1).bool():
                c = 1
            else:
                c = 0

        d = (2 * a)/(2 * a + b + c)
        d = math.sqrt(1-d)
        distance[m,k]=d
    return distance

此功能有效:它可以完成我需要它做的所有事情。但是,它非常缓慢。使用我的真实数据,运行内部循环最多需要一分钟。我更熟悉 R,同样的功能在几秒钟内运行。那么为什么这个函数在 python 中运行需要长达 25 分钟呢?

我做错了什么?

我猜问题是代码需要更加pythonic。我正在慢慢地从 R 迁移到 python,仍然有一些困难。例如,我不知道如何取消嵌套循环并使用 Numpy,因为一切都需要完美匹配和保存。对此问题的任何帮助将不胜感激。

我正在使用 python 3.7 和 spyder IDE。

标签: pythonpython-3.xnumpydataframenested-loops

解决方案


推荐阅读