Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 3.x Python-优化N中的2与N的组合,N非常大_Python 3.x_Pandas_Performance_Combinations_Large Data - Fatal编程技术网

Python 3.x Python-优化N中的2与N的组合,N非常大

Python 3.x Python-优化N中的2与N的组合,N非常大,python-3.x,pandas,performance,combinations,large-data,Python 3.x,Pandas,Performance,Combinations,Large Data,我试图找到满足特定条件的元素对。更准确地说,我想在50000个元素中形成2个(无序)元素的组合,这样就可以满足某个条件 我的数据集包含50000个元素,具有唯一标识符和一些可观察的元素(位置和截止点)。我想形成两个元素的无序对,这样两个成对元素之间的距离就低于给定的截止值 到目前为止,我的脚本如下 # Load the dataset (I have a custom function for it called loadFile) df = loadFile(path_input,filena

我试图找到满足特定条件的元素对。更准确地说,我想在50000个元素中形成2个(无序)元素的组合,这样就可以满足某个条件

我的数据集包含50000个元素,具有唯一标识符和一些可观察的元素(位置和截止点)。我想形成两个元素的无序对,这样两个成对元素之间的距离就低于给定的截止值

到目前为止,我的脚本如下

# Load the dataset (I have a custom function for it called loadFile)
df = loadFile(path_input,filename_input)

# Reset the index because I want to use the column "index" from 0 to 49,999
df = df.reset_index(drop=False)

# Initiate the list of pairs & get the number of elements
pairs = list()
nb_rows = df.shape[0]

# Loop over all the rows of my dataframe
for ind_x, x in df.iterrows():
    # Just print to know where we stand from 1 to 50,000
    print("{} out of {}".format(ind_x+1,nb_rows))
    # Loop over all the rows of my dataframe
    for ind_y, y in df.iterrows():
        # We only consider the y-row if it was not covered yet by the previous pairs
        # I also don't want to cover the case where both elements are equal
        if ind_x<ind_y:
            # Here is a custom condition (a simple function) returning a boolean
            if distance(x["location"],y["location"])<x["cutoff"]:
                pairs.append((x["id"],y["id"]))
#加载数据集(我有一个名为loadFile的自定义函数)
df=加载文件(路径输入、文件名输入)
#重置索引,因为我想使用从0到49999的列“index”
df=df.reset_索引(drop=False)
#启动配对列表并获取元素数
pairs=list()
nb_rows=df.shape[0]
#循环我的数据帧的所有行
对于ind_x,df.iterrows()中的x:
#只需打印就可以知道从1到50000的位置
打印(“{}out of{}.”格式(ind_x+1,nb_行))
#循环我的数据帧的所有行
对于ind_y,y在df.iterrows()中:
我们只考虑Y行,如果前面的对还没有覆盖
#我也不想讨论两个元素相等的情况

如果ind_x这只是寻找邻域集的经典问题。只要您的距离是欧几里德距离,就有许多专门的软件包提供了快速解决方法,但一个好的选择是利用scipy的:

这将创建一个包含所有索引对的numpy数组。它相当快,大部分运行时都被最后一对扩展占用:

df = pd.DataFrame(500*np.random.random(size=10**4), columns=['location'])
%timeit close_point_pairs(df['location'].values[:,np.newaxis], max_d=1.0)
530 ms ± 123 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
注意,我必须添加np.newaxis,因为这些点只有1D,不清楚您的位置点是什么,但是如果它们的维度更高,您应该删除它们


如果您需要原始数据帧中的唯一ID,您可以将其索引回原始数据帧或创建翻译词典。

iterrows()通常不推荐使用。嗨,Joseph,谢谢您的回答。你建议我改用.itertuples吗?看看这篇文章,如果你能够完全合并这两个帧,那么检查条件是否满足将是非常简单的,而且要快得多。但是,只包含与循环匹配的行(排除先前匹配的行)的逻辑可能很难实现。至少,这将它简化为最多50000个组的单个循环,我猜没有它也可以完成。非常感谢!我会仔细看看的!
df = pd.DataFrame(500*np.random.random(size=10**4), columns=['location'])
%timeit close_point_pairs(df['location'].values[:,np.newaxis], max_d=1.0)
530 ms ± 123 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)