如何高效执行循环语句进行数据分析?

How to efficiently preform loop statements for data analysis?

我最近写了这段代码来梳理数据点,它适用于小数据集。然而,每当数据集变得太大时,我得到的只是垃圾输出和 pycharm 控制台中显示 ! Too much output to process 的消息。那么最大行输出好像是55000行左右。

这段代码的重点是分析file1中坐标与file2中所有元素的接近度。然后 return 共享邻近度的坐标的任何结果匹配。正如您将在下面看到的,我写了一个嵌套的 for 循环来执行此操作,我理解这可能是一种蛮力策略,所以这可能是稍后获取错误消息的问题?

代码如下:

import numpy as np
import math as ma

filename1 = "C:\Users\Justin\Desktop\file1.data"
data1 = np.genfromtxt(filename1,
                     skip_header=1,
                     usecols=(0, 1))
                     #dtype=[
                            #("x1", "f9"),
                         #("y1", "f9")])
#print "data1", data1

filename2 = "C:\Users\Justin\Desktop\file2.data"
data2 = np.genfromtxt(filename2,
                      skip_header=1,
                      usecols=(0, 1))
                      #dtype=[
                             #("x2", "f9"),
                             #("y2", "f9")])

#print "data2",data2

def d(a,b):
    d = ma.acos(ma.sin(ma.radians(a[1]))*ma.sin(ma.radians(b[1]))
                +ma.cos(ma.radians(a[1]))*ma.cos(ma.radians(b[1]))*       (ma.cos(ma.radians((a[0]-b[0])))))
    return d

results = open("results.txt", "w")

for coor1 in data1:
    for coor2 in data2:
        n=0
        a = [coor1[0], coor1[1]]
        b = [coor2[0], coor2[1]]
        #print "a", a
        #print "b", b

    if d(a, b) < 0.07865:  # if true what happens
        results.write("\t".join([str(coor1), str(coor2), "True", str(d)]) + "\n")

    else:
        results.write("\t".join([str(coor1), str(coor2), "False", str(d)]) + "\n")
results.close()

理想情况下,当我开始交叉检查每个超过 500,000 个坐标的数据文件时,我不会遇到这个问题,因为我怀疑它们中的许多会共享很多接近度。

但是发布这个有 2 个原因(又是某种原因)。首先与任何可以使用它的人共享此代码,因为它已被证明是分析任意球面数据或坐标的强大工具 space。其次,看看是否有人对如何提高效率并帮助我解决错误消息有任何建议?

最具体的错误消息出现在我的邻近限制是大量的分离以及读取两个元素 "a" 和 "b" 时。

我真的怀疑 pycharm 在处理超过 55,000 行输出时有问题,但我不知道...我的猜测是我搞砸了代码,或者它可能是 windows 10题?

在此先感谢您的帮助。我对此很陌生,所以任何建议肯定会有用。

正如 dblclik 在他对 post 的评论中提到的,当然有一些方法可以让您的代码更高效,避免嵌套 for 循环的完整计算。但是我认为这不会帮助您解决错误消息,您会得到:

我不认为 PyCharm 处理 n 行代码有问题,正如你提到的那样,我相当怀疑,事实是你正在打印,即 输出,你们都输出到PyCharm,尤其是在打印不太近的x y的距离时,需要内存。

我建议您不要打印结果,而是尝试将其保存到 .txt 文件或距离矩阵中。这样你也可以保存计算的输出!

示例: 将结果保存到列表

results = []
...
for coor1 in data1:
    for coor2 in data2:
        distance = d(a, b)
        if distance < thresh:
            results.append((str(coor1), str(coor2), "True", str(distance)))

        else:
            results.append((str(coor1), str(coor2), "False", str(distance)))            

示例: 保存到文本文件

results = open("results.txt", "w")
...
for coor1 in data1:
    for coor2 in data2:
        distance = d(a, b)
        if distance < thresh:

            results.write("\t".join([str(coor1), str(coor2), "True", str(distance)])+"\n")

        else:
            results.write("\t".join([str(coor1), str(coor2), "False", str(distance)])+"\n")                
results.close()

我希望这个方法能帮助你运行你的脚本完全通过!