# Numpy #5 資料讀寫存取 ## 陣列讀寫 with open('one_array.npy', 'wb') as f: 開啟one_array.npy檔,如果沒有的話就會創造 wb代表操作模式是寫入w且二進位b 且此檔案也被叫作f np.save(檔名, 新增的array) 在該檔內寫入新增的array 檔名由上面舉例的話就是f 一次存一個array,再多寫就會新增於該檔後面 np.savez(檔名, 新增的array) 同上,但可以新增很多array,用,隔開 但開啟檔名就要變成.npz而非.npy 儲存的時候,各array可以指定名稱,例如arr1=x,arr2=y... 若沒有指定的話,預設名稱是arr_0,arr_1... 如果輸入 檔名.file 指令,就可以得到這些名稱(list方式呈現) np.load(檔名) 載入該檔名的array npy一次load一個array npz一次load全部array 令a = np.load(檔名) print(a['陣列名稱']) 可以得到該array ### 存讀文字檔 np.savetxt('檔名') gz檔不用解壓縮 可加以下資訊 要儲存的一維或二維陣列X=(只能存1D或2D),若是1維陣列必須用[]包起來,否則分隔符號會被忽略 陣列元素的格式fmt=(預設%.18e),例如科學記號的格式定義(%1.4e)、整數(%d)、浮點數(%f)... 分隔符號delimiter=(預設空格) 換行字元newline=(預設n) 檔頭註解文字header=(預設空字串) 檔尾註解文字footer(預設空字串) 上面兩個註解文字的前綴字元或字串comments=(預設#加一空格,意思就是標頭標尾都會用# 開頭) 檔案的字元編碼encoding=(預設None) %load 檔名 可以查看檔案內容 np.loadtxt('檔名'或list等等) 讀檔 可加以下資訊 陣列的資料型別dtype=(預設float) 註解文字的前綴字元或字串comments=(預設# ) 分隔符號delimiter=(預設None) 以字典型別定義converters=( {column:轉換函式} key/value值,預設None) 讀取時要略過開頭的row數skiprows=(預設0) 要讀取的column,usecols=(預設None) unpack=(預設False,如果是True的話,會轉置輸出的陣列) 設定傳回陣列的最低軸數ndmin=(預設0) 檔案的字元編碼encoding=(預設bytes) 在skiprows的row數目後,最大的讀取row數目max_rows=(預設None,讀取所有資料) ### 更有彈性的讀檔方法 np.genfromtxt('檔名'或list等等) 可加以下資訊 陣列的資料型別dtype=(預設float) 註解文字的前綴字元或字串comments=(預設# ) 分隔符號delimite=(預設None),若輸入數字或數列則代表固定的寬度 讀取時忽略的檔頭行數skip_header=(預設0) 讀取時忽略的檔尾行數skip_footer=(預設0) 以字典型別定義converters=( {column:轉換函式} key/value值,預設None) 用來識別缺值的字串missing_values=(預設None,可指定哪些可以視為缺值,也可以用數列呈現不同欄位要辨認為缺值的東西) 用來填入缺值的值filling_values=(預設None,bool預設是False;int預設是-1;float預設是np.nan;str預設是";可以指定其他字來取代缺值,也可以用數列呈現不同欄位要填的東西) 要讀取的column,usecols=(預設None,若想讀某幾欄位可以輸入ex("a","c"),若沒有欄位名稱則輸入索引值ex(1,-1),有欄位名稱names則不能輸入索引值,會出錯) column名稱names=(預設None,如果是True則會讀取第一行做為欄位名稱,若沒有欄位名稱可以輸入ex"a ,b ,c",若沒給定或給定不夠,則回傳的時候會用f0 f1 f2...命名,若要改規則可用下面的defaultfmt) 要排除的column名稱excludelist=(預設None) 須從column名稱中刪除的字元deletechars=(預設#$%&'()*+, -./:;<=>?@[]^{) 要取代空格的字元replace_space=(預設_) 是否自動去空格autostrip=(預設False) 欄位名稱是否區分大小寫case_sensitive=(預設True,可以設定True/False/upper(轉為大寫)/lower(轉為小寫)) 如果names未定義完整名稱defaultfmt=(預設f%i也就是f0 f1...,可用來定義structured dtype的column名稱;若要更改成例如v0 v1 v2...則可以輸入v%i) unpack=(預設False,如果是True的話,會轉置輸出的陣列) usemask=(預設False,如果是True的話,回傳masked array;否則回傳正常的array=) loose=(預設True,如果是True的話,無效的值不會導致錯誤) invalid_raise=(預設True,設為True時,如果column數目不合會拋出 exception;如果設為False的話,拋出warning並且跳過不合數目的資料) 在skiprows的row數目後,最大的讀取row數目max_rows=(預設None,預設讀取所有資料) 檔案的字元編碼encoding=(預設bytes) 從內部存取中讀寫 from io import StringIO 創建StringIO a=...... np.genfromtxt(StringIO(a)) 就可以把字串a寫進去且變成array SringIO參考: https://www.mdeditor.tw/pl/gzzr/zh-hk 資料轉換converters舉例 原始資料 np.genfromtxt("transform.txt", delimiter=',', dtype="i8, i8, U3, U3") array([(1, 2, 'Yes', '87%'), (3, 4, 'No', '3%'), (5, 6, 'Yes', '55%')], dtype=[('f0', '<i8'), ('f1', '<i8'), ('f2', '<U3'), ('f3', '<U3')]) 想要把Yes變成1 No變成0;百分比變成小數 先定義函式 def trans(s): if s == b'Yes': return 1 else: return 0 def conversion(x): return float(x.strip(b"%"))/100 轉換 column索引:函式 np.genfromtxt("transform.txt", delimiter=',', converters={2:trans, 3:conversion}) 其他參考: https://numpy.org/doc/stable/user/basics.io.genfromtxt.html ###### tags: `資料分析` `numpy` `python`