看板 Python 關於我們 聯絡資訊
安安大家好,小弟 python 新手。 因實驗緣故,我經常會有個 *.csv 檔,例如這個 gist 裡頭的 第二份檔案 APD23_BDlines.csv, https://gist.github.com/3847082e32d93eeead73b3acb7fc1914.git 第一份檔案 APD23.py 是我讀取 *.csv 的方式。在這個 APD23_BDlines.csv 裡面有很多條曲線的 (x,y) 座標,大致如下 DopingConcentration(C1(n300_des_2)) X DopingConcentration(C1(n300_des_2)) Y DopingConcentration(C1(n302_des)) X DopingConcentration(C1(n302_des)) Y DopingConcentration(C1(n304_des)) X DopingConcentration(C1(n304_des)) Y .... 而我希望能夠寫個程式,將每條曲線的 (x,y) 座標分別存入兩個陣列。我的步驟是: 1. 判斷每條曲線有多少個數據點 2. 為每條曲線建立 array 3. 讀取數據,將數據存入 array 上述連結中的第一份程式碼 APD23.py 是我的實際作法。 這樣的步驟讓我很疲累,因為其實我的 *.csv 格式都是一樣的。 1. 第一橫列,都是我的資料名稱,並且以 x1, y1, x2, y2, ... 規則排列 2. 各直行的第二橫列底下,都是我的資料。 所以我希望能夠 1. 自動判斷有多少組 (x,y) 並建立相對應的陣列數目,自動命名陣列與設定陣列長度。 2. 自動將 *.csv 中的數據儲存至每個陣列中 我想了很久,都不知道怎麼做 QQ 有大大可以教我嗎 >< 因為我 想快速分析很多資料,但這樣人為建立陣列實在是太耗時了。 而如果自動命名與建立陣列,那我其實也不知道該怎麼寫這種 「尚未存在的陣列」的數據處理程式...因為我連名字都不知道 QQ 請各位大大幫忙一下 >< 感謝! -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 123.192.0.245 ※ 文章網址: https://www.ptt.cc/bbs/Python/M.1547625918.A.1BC.html
sherees: 試試看 eval 01/16 16:09
感謝大大,我現在就來搜尋 !! 大大,剛搜尋了一下,看不太懂這 eval 可以拿來做些什麼...Orz 我繼續研究研究
sherees: 應該是要用 exec 才對 0.0 01/16 16:22
哦哦我查查看...
sherees: 你可以用來 assign 現在不存在的變數 01/16 16:23
sherees: 只要把字串的邏輯寫好就好 01/16 16:23
大大您的意思是說,我可以用 exec 來執行現在不存在的變數嗎? 所以 exec 並不是用來自動讀取 *.csv 並自動建立陣列的囉?
sherees: 恩恩 所以你裡面的 var_1, 2, 3... 可以用這個來解決 01/16 16:28
了解,這是我遇到的第一個有點難理解的東西 XD 需要花點時間來瞭解怎麼用了.. 謝謝大大... 那想請問不曉得您對於「自動建立陣列」有什麼想法嗎? 感覺至少要先建立了陣列,才能使用 exec ?
s860134: 這個問題取決於你之後資料要怎麼做處理 01/16 20:48
大大您好,我之後會對曲線微分積分,而且會將每條曲線之間作四則運算或積分等。 但因為每個曲線的數據點不盡相同,所以我在進行曲線之間的運算之前,我會需要 先重整化每條曲線的數據,意思是說,讓他們有著相同的 x 座標。方法大概是 簡單的內插外插法。 仔細想下去感覺很難,因為我的 array 命名... WOW 好簡潔整齊的 code ........ (羨慕佩服 我研究一下!十分感謝大大幫助啊!!!想了好久 ※ 編輯: Philethan (123.192.0.245), 01/16/2019 21:20:43
s860134: 你 arry 命名、順序重不重要? 01/16 21:20
s860134: 裡面需要改善的事: dict -> OrderedDict, 去除無用的値 01/16 21:22
s860134: list 類別要改為 numpy 的類別 01/16 21:22
s860134: dict 可以由 dict.keys() 取得 key 值列表 01/16 21:23
s860134: 變數規則如果不只單空格,可以用 rsplit或是 regexp 01/16 21:24
大大您好,我執行原本的 APD23_BDlines.csv 時成功了! 但是如果換成別的 *.csv 檔就會出現 error Traceback (most recent call last): File "/Users/..../code_ptt.py", line 25, in <module> result = parse_csv(csv_path) File "/Users/..../code_ptt.py", line 11, in parse_csv curve_name, x_y = fieldname.split(' ') ValueError: too many values to unpack (expected 2) Process finished with exit code 1 array 命名部分,如果能夠為指明是曲線A的x座標,曲線B的y座標,那就太好了QQ 我以前是這樣: 曲線A的x座標:xA = [xA1, xA2, xA3, ...., xA650] 曲線A的y座標:yA = [yA1, yA2, yA3, ...., yA650] 曲線B的x座標:xB = [xB1, xB2, xB3, ...., xB310] 曲線B的y座標:yB = [yB1, yB2, yB3, ...., yB310] 另外在同一份 *.csv 中,不同曲線的數據數目不同,所以會有 - 符號出現。 這時我希望可以讓 array 長度就停止在這,否則之後繪圖可能會有些問題>< 非常感謝大大幫助!
s860134: 這就是切割字串的問題囉~ 01/16 21:29
s860134: "too many values to unpack" 是因為右側執行結果多餘 01/16 21:30
s860134: 左側的變數數量,所以我才說你要用 rsplit 或 re 01/16 21:31
s860134: 'AA BB CC'.rsplit(' ', 1) == ['AA BB','CC'] 01/16 21:32
大大我好像了解了,因為我另一個 *.csv 檔案的曲線名稱中有空格。 原則上是以 , 作為分割 :) 我查一下您說的 resplit,十分感謝您!
s860134: 這些問題你都能解決,先搞清楚自己要解決的問題 01/16 21:33
s860134: 去找相關的關鍵字應該都不是問題 01/16 21:34
好的,非常感謝您,已經有非常多嘗試的方向!感謝大大!
s860134: 至於 '-' 的問題, for 迴圈有 continue 可以用 01/16 21:35
哦!感謝大大,我以前是用網路上找到的 def isfloat(value): try: float(value) return True except ValueError: return False 感謝很麻煩,還要一直用 if condition 判斷 True or False,我待會來 研究如何用 continue 處理 '-',感覺很簡便!我先研究一下怎麼依照逗點分割.. --- 阿阿原來大大您早就在推文指出該怎麼改了,抱歉我資質太差,現在才看懂XD 感謝您 已經沒有 error 了!我可接著著手後面的array了^^ 已完成拉!!謝謝樓上各位大大的協助!真的是非常感謝 :) 我的Code: https://paste.ofcode.org/EXMECLrxyeujHi8nsvppcB
s860134: 其實你不見得要 exec ,不過堪用就好... 囧 01/16 23:35
小弟我只會這個...其實也是剛剛才學會的哈哈 不知道大大您有沒有其他建議 >< ※ 編輯: Philethan (123.192.0.245), 01/16/2019 23:36:52
s860134: 只是對 python 基本型別的 method 不熟而已 01/17 00:00
s860134: 建議也沒甚麼,其實不用把要圖的內容賦值到變數也話得出 01/17 00:00
s860134: 畫 01/17 00:01
s860134: 用 exec 製造很多變數其實最後你還是把他帶到同個函數 01/17 00:01
s860134: 這樣的用法和你用 for 迴圈畫圖差不多意思思 01/17 00:02
哦哦 那如果不用 exec 製造 array,有辦法處理各曲線的微分、積分與互相的 四則運算嗎?原來有辦法用 for loop 畫圖哦@@感謝!我再來學學 XD ※ 編輯: Philethan (123.192.0.245), 01/17/2019 00:06:07