簡體   English   中英

嵌套用於多個數據文件的循環和數據分析

[英]Nested for loops and data analysis across multiple data files

我已經編寫了以下代碼,並且遇到了一些最后的小問題,可以幫助您解決這些問題,一旦弄清了這些問題,我認為這對將來進行點鄰近數據分析的人非常有用。

此代碼的目的是將兩個單獨的數據列表作為單個點讀入numpy數組。 從那里開始,嵌套的for循環用於獲取file1中的點1並將其角度間隔與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 盡管產生了很多結果,但是! Too much output to process ((這可能是PyCharm的問題嗎?)。)2.)我的代碼的第一行返回完全的廢話,並且每次輸出更改都沒有at / f結果。 隨着更多的測試,這似乎是處理問題太多的結果。

我認為可能是一些我似乎無法補救或根本不了解的潛在問題:

1.)我沒有正確定義a = [coor1[0], coor1[1]] b = [coor2[0], coor2[1]]或未正確調用坐標。 但是,這再次與其他測試文件完美配合。

2)由於我正在運行Windows,.data文件已從Mac的原始格式中損壞。 我試過將它們重命名為.txt,甚至在單詞中也重命名,但是文件完全搞砸了。 我已經放心,這應該無關緊要,但是我仍然懷疑……尤其是因為我無法打開它們而不會破壞數據格式。

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部分中執行更多代碼?

您的“輸出過多”問題可能僅僅是由於所有打印語句。 您是否嘗試將其注釋掉以查看會發生什么?

經過更多的研究並從同事那里獲得了一些建議,這些建議是關於如何用不同的變量最好地測試我的代碼的,我意識到我編寫的代碼實際上正在按照我想要的去做。 看來(至少目前)一切都很好。 我所做的只是將接近度搜索限制在一個較小的字段上,因為在返回距離10,000 x 10,000的結果之前,同時打印了距離,坐標點和T / F語句。

因此,當搜索字段足夠小時,代碼完全可以滿足我的需要,但是至於我為什么不確定too much output to process錯誤,我不確定,但是我可能會在此處發布另一個問題,以澄清問題這個問題。 同樣,以上代碼雖然是蠻力的,而且是基本的方法,但是它是一種用於分析for循環中多個表之間的點的接近度的非常有效的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM