python - 有没有办法在 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。
解决方案
推荐阅读
- java - 使用枚举创建安全工厂实例
- npm - 通过 npm 卸载 quasar-cli 不起作用?
- asp.net-core - EF Core 3.1 如何包含拥有实体的嵌套属性
- flutter - Flutter中如何获取一个存储的极端根目录?
- php - PHP - 通过循环解析嵌套的 JSON 数组
- android - 是否可以在主活动(Android)中调用另一个活动的静态类中定义的方法?
- python - BeautifulSoup 如何在具有类的 div 中查找所有 href 链接
- python - Post 方法在 updateview django 中不起作用
- javascript - 如何检查是否存在具有相同键的对象并使用数组(javascript)中的相同键和不同属性进行更新?
- django - 显示特定作者每篇文章的浏览次数