我已经编写了以下代码,并且我只是有一些最后的小问题,我可以使用一些帮助,一旦完成,我认为这对于将来对点接近进行数据分析的人非常有用。
此代码的目的是将两个单独的数据列表作为单个点读入并读入numpy数组。从那里,嵌套for循环用于在file1中取第一点,并将其角度间隔与file2中的每个点进行比较,然后在file1中指向第2点,并将其与file2中的每个元素进行比较,依此类推。
这些代码对我的所有测试文件都有很好的效果,每个测试文件只有大约100个元素。我很确定球面坐标中的角度分离是正确写入的,并且已将测量值转换为弧度而不是度数。
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
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.0174533: # if true what happens
n += 1
print 'True', d(a,b)
if n == 0: # if false what happens
print 'False', d(a,b)
不幸的是,我现在遇到了更大的文件(每个文件中有10,000-500,000个数据点)的问题,并将其缩小到几个方面,但首先是我的问题:
1.)运行时,输出窗口指出! Too much output to process
尽管有很多结果。 ((这可能是PyCharm问题吗?))
2.)我的代码的第一行返回完全无意义,输出每次都改变而没有t / f结果。通过更多测试,这似乎特定于过多的输出处理问题。
我认为可能是一些我似乎无法解决的或潜在的问题:
1。)我没有正确定义a = [coor1[0], coor1[1]] b = [coor2[0], coor2[1]]
或未正确调用坐标。但同样,这与其他测试文件完美配合。
2。)由于我正在运行Windows,因此.data文件会因来自Mac的原始格式而损坏。我已经尝试将它们重命名为.txt甚至是单词,但文件完全搞砸了。我确信这不重要,但我仍然怀疑......特别是因为我无法打开它们而不会破坏数据格式。
3。)文件对于我的计算机而言太大了,或者pycharm / numpy有效处理,尽管我对此表示怀疑。
4。)只是为了涵盖所有基础:我的代码可能很糟糕,我需要了解更多?这是第一个大项目,所以如果这样的话,请不要犹豫,指出任何可能有帮助的事情。
答案 0 :(得分:0)
首先,一个建议:我在使用pandas.read_csv()阅读大型ASCII文件(技嘉大小,1500万数据点)方面有很好的经验。我遇到的速度最快,接近硬盘读取速度,比genfromtxt快得多。
关于嵌套循环:我认为整个循环可以完全替换。这可能会使其增加数量级。
import numpy as np
import math as ma
#file import here
#define d here
#compute a 2d-array of separations using list comprehension
sep = [d(c1,c2) for c1 in data1 for c2 in data2]
sep = np.array(sep).reshape(data1.shape[0],data2.shape[0])
index = np.where(sep < 0.0174533)
n = len(index[0])
此外,你应该使用np.sin()等代替ma.sin()等。所有函数都在numpy中(ma.acos - &gt; np.arccos,ma.radians - &gt; np.deg2rad) 。然后你不必将每一行重新定义为&#34; a&#34;和&#34; b&#34;每一次。
不确定这对您是否有用,具体取决于您是否要在if ... else部分执行更多代码?
你的输出太多&#34;问题可能只是因为所有的印刷声明。你有没有试过评论它们看看会发生什么?
答案 1 :(得分:0)
经过一些研究并从同事那里得到一些关于如何使用不同变量对我的代码进行最佳测试的建议后,我意识到我编写的代码实际上正是我想要的。似乎(至少现在)一切都很好。我所做的就是将我的邻近搜索限制在一个小得多的字段,因为它在打印距离,坐标点和T / F语句之前返回10,000 x 10,000个结果。
因此,当搜索字段足够小时,代码完全符合我的需要,但至于为什么我遇到too much output to process
错误我不确定,但我可能会在这里发布另一个问题试图澄清这个问题。同样,上面的代码虽然可能是暴力和基本的方法,但它是分析for循环中多个表的点的接近度的一种非常有效的方法。