2017-02-24 90 views
0

我的問題類似於this;我嘗試使用genfromtxt,但仍然無法正常工作。按預期方式讀取文件,但不能作爲浮點數。下面如何將numpy字節轉換爲在python3中浮動?

 temp = np.genfromtxt('PFRP_12.csv', names=True, skip_header=1, comments="#", delimiter=",", dtype=None) 

代碼和文件摘錄原文(b'"0"', b'"0.2241135"', b'"0"', b'"0.01245075"', b'"0"', b'"0"')

 "1 _ 1",,,,, 
    "Time","Force","Stroke","Stress","Strain","Disp." 
    #"sec","N","mm","MPa","%","mm" 
    "0","0.2241135","0","0.01245075","0","0" 
    "0.1","0.2304713","0.0016","0.01280396","0.001066667","0.0016" 
    "0.2","1.707077","0.004675","0.09483761","0.003116667","0.004675" 

我用不同的dtypes(無,STR,浮點,字節),仍然沒有成功嘗試。謝謝!

編輯:Evert提到我試圖浮動也讀,但他們都因爲沒有(nan, nan, nan, nan, nan, nan)

+0

請閱讀[文檔](https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html),並使用'dtype = float'而不是'dtype = None'。 – Evert

+0

@Evert是的,浮子給了所有的楠。既然看起來很簡單,我花了大概一個小時尋找,但沒有任何幫助。 –

+0

第二個代碼是否阻止了您的輸入或輸出? – Evert

回答

1

另一種解決方案是使用converters參數:

np.genfromtxt('inp.txt', names=True, skip_header=1, comments="#", 
delimiter=",", dtype=None, 
converters=dict((i, lambda s: float(s.decode().strip('"'))) for i in range(6))) 

(你需要爲每列指定一個轉換器)。

備註奇怪的是,雖然dtype="U12"或類似的應該實際上產生的字符串,而不是字節(避免.decode()部分),這似乎並沒有工作,並導致空條目。

+0

該轉換器也可以工作:lambda s:float(s。strip(b'「')))'(即字節串也有一個strip方法)。 – hpaulj

0

這裏是你正在尋找一個幻想,不可讀,函數式編程風格的輸入轉換爲記錄陣列的方式:

>>> np.core.records.fromarrays(np.asarray([float(y.decode().strip('"')) for x in temp for y in x]).reshape(-1, temp.shape[0]), names=temp.dtype.names, formats=['f'] * len(temp.dtype.names)) 

或跨幾行展開:

>>> np.core.records.fromarrays(
... np.asarray(
...  [float(y.decode().strip('"')) for x in temp for y in x] 
... ).reshape(-1, temp.shape[0]), 
... names=temp.dtype.names, 
... formats=['f'] * len(temp.dtype.names)) 

我不會推薦這個解決方案,但SOMET imes一起攻擊這樣的事情很有趣。


您的數據問題比看起來有點複雜。 這是因爲您CSV文件中的數字確實是而不是數字:它們顯式字符串,因爲它們具有雙引號。

因此,有涉及在轉換3個步驟爲float: - 解碼字節到Python 3(Unicode)的字符串 - 刪除(條)從每個字符串 的每個端部的雙引號 - 轉換剩餘字符串浮動

這發生在雙列表理解中,在第3行。這是一個雙列表理解,因爲rec-array本質上是2D。
結果列表是1D。我把它變成一個numpy數組(np.asarray),所以我可以很容易地重塑2D。那個(現在是純浮點數)數組然後被賦予np.core.records.fromarrays,其名稱取自原始的rec-array,並且爲每個字段設置的格式爲浮點數。