【发布时间】: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