如何有效地为循环语句预先形成数据分析?

时间:2016-08-25 19:36:58

标签: python numpy coordinates pycharm data-analysis

我最近编写了这个代码来梳理数据点,它可以很好地处理小数据集。然而,每当数据集变得太大时,我得到的是垃圾输出和pycharm控制台中的一条消息,其中显示! Too much output to process。然后最大线输出似乎是大约55,000行。

此代码的要点是分析file1中坐标与file2中所有元素的接近程度。然后返回任何匹配的坐标匹配的匹配。正如您将在下面看到的,我编写了一个嵌套的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个坐标的数据文件时,我不会遇到这个问题,因为我怀疑它们中的许多会分享很多接近度。

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

最明确的是,当我的邻近限制是一个巨大的分离以及读取两个元素时,会出现错误消息&#34; a&#34;和&#34; b&#34;。

我真的怀疑pycharm处理超过55,000行输出的问题,但我不知道......我的猜测是我要么破坏代码,要么可能是Windows 10的问题?

提前感谢您的帮助。我对此很新,所以任何建议肯定都会有用。

1 个答案:

答案 0 :(得分:2)

正如dblclik在他对该帖子的评论中提到的那样,有一些方法可以使你的代码更有效,避免了嵌套for循环的完整计算。但是,我认为这不会帮助您解决错误消息:

我不认为PyCharm在处理n行代码时有一个问题,因为你提到,我更确切地说,这是事实,你正在打印,即输出,所有人输出到PyCharm,特别是在打印不太接近的xy的距离时需要记忆。

我建议您不要打印结果,而是尝试将其保存到.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()

我希望这种方法可以帮助您完全运行脚本!