【问题标题】:How to efficiently preform loop statements for data analysis?如何高效地执行循环语句进行数据分析?
【发布时间】:2016-08-25 19:36:57
【问题描述】:

我最近编写了这段代码来梳理数据点,它非常适合小型数据集。但是,每当数据集变得太大时,我得到的只是垃圾输出和 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 个坐标的数据文件时,我不会遇到这个问题,因为我怀疑它们中的许多会共享很多接近度。

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

最具体地说,当我的接近限制是大量分离以及同时读取元素“a”和“b”时,会出现错误消息。

我真的怀疑 pycharm 在处理超过 55,000 行输出时是否存在问题,但我不知道...我的猜测是我要么搞砸了代码,要么可能是 Windows 10 的问题?

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

【问题讨论】:

  • 嗨贾斯汀,你应该考虑在你的 Haversine 函数(看起来像你用于地理空间距离的函数)之前做的事情是使用边界框。它是一种启发式方法,仅计算适合由搜索半径直径形成的框内的点的距离(即,2 公里半径将变为以给定点为中心的 4 公里 x 4 公里框)。这非常快,可以为您节省大量时间。另外,请查看Geopy,这是一个非常方便的地理空间分析包
  • @dblclik 谢谢,我会调查的!但是你知道那个特定的包是否会在球坐标中进行径向搜索吗?

标签: python numpy coordinates pycharm data-analysis


【解决方案1】:

正如 dblclik 在他对帖子的评论中提到的那样,肯定有一些方法可以让您的代码更高效,避免嵌套 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()

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

【讨论】:

  • 好的,这是个好主意。在这种情况下,“/t”是新文件的名称吗?我是否需要打开并保存一个空文本文件以用于数据放置?
  • 1) 输出文件在第一行代码中创建。语法是 open(filename, mode)。 'w' 代表写入,与 'r' 读取文件相对。我添加了一行额外的代码来关闭文件对象。你不需要这个来保存你的文件。 2) join(list) 语句创建一个字符串,通过调用它的分隔符连接列表的字符串。在此示例中,我选择了一个选项卡来分隔我的值,这会创建一个 .tsv 文件(就像您有 .csv 文件一样)。
  • 我对上面的代码做了修改。我收到一条错误消息,指出results.write("\t".join([str(coor1), str(coor2), "True", str(d)]) + "\n") ValueError: I/O operation on closed file。我认为这是一个好主意,实际上我一直想这样做,我想我可能对如何集成代码有点困惑。最具体地说,文件将存储在哪里,如何命令它们以清晰的方式存储,以及文件的类型。
  • 您好,我仍然坚持尝试整合您的建议,有什么建议吗?我上面的代码是最新的尝试,我对您的建议所做的最后评论仍然是我遇到的相同问题。请帮忙?
  • 我在答案中添加了另一个示例,您可以将结果保存到列表中,而不是打印。这应该使您能够运行代码而不会从 PyCharm 收到原始错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-05-06
  • 2013-09-15
  • 2020-11-17
  • 2014-05-12
  • 1970-01-01
  • 2012-04-12
  • 2016-07-18
相关资源
最近更新 更多