嵌套for循环和跨多个数据文件的数据分析
Nested for loops and data analysis across multiple data files
我已经写了下面的代码,只是遇到了一些最后的小问题,我可以使用一些帮助,一旦完善,我认为这对人们在点接近度上进行数据分析真的很有用未来。
此代码的目的是将两个单独的数据列表作为单独的点读入并读入一个 numpy 数组。从那里嵌套的 for 循环旨在获取文件 1 中的第一个点并将其 angular 分隔与文件 2 中的每个点进行比较,然后将文件 1 中的点 2 与文件 2 中的每个元素进行比较,依此类推。
对于我所有的测试文件,每个文件只有大约 100 个元素,该代码运行得非常好。我很确定球坐标中的 angular 分隔已正确编写,并且已将测量值转换为弧度而不是度数。
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.) 当 运行 时,输出 window 表示 ! Too much output to process
尽管它产生了大量结果。 ((这可能是 PyCharm 问题吗?))
2.) 我的代码的第一行完全是胡说八道,输出每次都在变化,但没有 t/f 结果。通过更多测试,这似乎特定于 Too much output to process 问题。
我认为可能是一些我似乎无法解决或只是不理解的潜在问题:
1.) 我没有正确定义 a = [coor1[0], coor1[1]] b = [coor2[0], coor2[1]]
或者没有正确调用坐标。但同样,这与其他测试文件完美配合。
2.) 由于我是 运行 windows,.data 文件从 Mac 的原始格式中损坏。我试过将它们重命名为 .txt 甚至在 word 中,但文件完全搞砸了。我已经确信这无关紧要,但我仍然怀疑......特别是因为我无法在不破坏数据格式的情况下打开它们。
3.) 这些文件对我的电脑来说太大了,或者 pycharm/numpy 无法有效处理,尽管我对此表示怀疑。
4.) 只是为了涵盖所有基础:我的代码可能很烂,我需要学习更多?这里是第一个大项目,所以如果是这样的话,请不要犹豫,指出任何可能有用的东西。
首先,一个建议:我在使用 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 -> np.arccos, ma.radians -> np.deg2rad)。然后你不必每次都将每一行重新定义为 "a" 和 "b"。
不确定这对您是否有用,具体取决于您是否要在 if...else 部分执行更多代码?
您的 "too much output" 问题可能仅仅是因为所有打印语句。您是否尝试过将它们注释掉以查看会发生什么?
经过更多研究并从同事那里得到一些关于如何使用不同变量最好地测试我的代码的建议后,我意识到我编写的代码实际上完全符合我的要求。似乎(至少现在)一切都很好。我所做的只是将邻近搜索限制在一个更小的字段中,因为在打印距离、坐标点和 T/F 语句时返回 10,000 x 10,000 个结果之前。
因此,当搜索字段足够小时,代码完全符合我的需要,但至于我为什么会出现 too much output to process
错误,我不确定,但我可能会 post 这里的另一个问题试图澄清这个问题。同样,上面的代码虽然可能是蛮力和基本方法,但它是一种非常有效的分析 for 循环中跨多个表的点接近度的方法。
我已经写了下面的代码,只是遇到了一些最后的小问题,我可以使用一些帮助,一旦完善,我认为这对人们在点接近度上进行数据分析真的很有用未来。
此代码的目的是将两个单独的数据列表作为单独的点读入并读入一个 numpy 数组。从那里嵌套的 for 循环旨在获取文件 1 中的第一个点并将其 angular 分隔与文件 2 中的每个点进行比较,然后将文件 1 中的点 2 与文件 2 中的每个元素进行比较,依此类推。
对于我所有的测试文件,每个文件只有大约 100 个元素,该代码运行得非常好。我很确定球坐标中的 angular 分隔已正确编写,并且已将测量值转换为弧度而不是度数。
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.) 当 运行 时,输出 window 表示 ! Too much output to process
尽管它产生了大量结果。 ((这可能是 PyCharm 问题吗?))
2.) 我的代码的第一行完全是胡说八道,输出每次都在变化,但没有 t/f 结果。通过更多测试,这似乎特定于 Too much output to process 问题。
我认为可能是一些我似乎无法解决或只是不理解的潜在问题:
1.) 我没有正确定义 a = [coor1[0], coor1[1]] b = [coor2[0], coor2[1]]
或者没有正确调用坐标。但同样,这与其他测试文件完美配合。
2.) 由于我是 运行 windows,.data 文件从 Mac 的原始格式中损坏。我试过将它们重命名为 .txt 甚至在 word 中,但文件完全搞砸了。我已经确信这无关紧要,但我仍然怀疑......特别是因为我无法在不破坏数据格式的情况下打开它们。
3.) 这些文件对我的电脑来说太大了,或者 pycharm/numpy 无法有效处理,尽管我对此表示怀疑。
4.) 只是为了涵盖所有基础:我的代码可能很烂,我需要学习更多?这里是第一个大项目,所以如果是这样的话,请不要犹豫,指出任何可能有用的东西。
首先,一个建议:我在使用 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 -> np.arccos, ma.radians -> np.deg2rad)。然后你不必每次都将每一行重新定义为 "a" 和 "b"。
不确定这对您是否有用,具体取决于您是否要在 if...else 部分执行更多代码?
您的 "too much output" 问题可能仅仅是因为所有打印语句。您是否尝试过将它们注释掉以查看会发生什么?
经过更多研究并从同事那里得到一些关于如何使用不同变量最好地测试我的代码的建议后,我意识到我编写的代码实际上完全符合我的要求。似乎(至少现在)一切都很好。我所做的只是将邻近搜索限制在一个更小的字段中,因为在打印距离、坐标点和 T/F 语句时返回 10,000 x 10,000 个结果之前。
因此,当搜索字段足够小时,代码完全符合我的需要,但至于我为什么会出现 too much output to process
错误,我不确定,但我可能会 post 这里的另一个问题试图澄清这个问题。同样,上面的代码虽然可能是蛮力和基本方法,但它是一种非常有效的分析 for 循环中跨多个表的点接近度的方法。