2016-08-27 46 views
0

我試圖從平面文件中導入文本並將其轉換爲單行內的浮點值。我看過this post,它有相同的錯誤,但我沒有找到哪些字符在我的輸入文件中無效。或者我有語法錯誤?將導入的字符串轉換爲浮點數與numpy的loadtext

導入爲字符串的打印結果:

data = np.loadtxt(file, delimiter='\t', dtype=str) 
print(data[0:2]) 
... 
[["b'Time'" "b'Percent'"] 
["b'99'" "b'0.067'"]] 

嘗試導入爲float:

# Import data as floats and skip the first row: data_float 
data_float = np.loadtxt(data, delimiter='\t', dtype=float, skiprows=1) 

它引發以下錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    data_float = np.loadtxt(data, delimiter='\t', dtype=float, skiprows=1) 
    File "<stdin>", line 848, in loadtxt 
    items = [conv(val) for (conv, val) in zip(converters, vals)] 
    File "<stdin>", line 848, in <listcomp> 
    items = [conv(val) for (conv, val) in zip(converters, vals)] 
ValueError: could not convert string to float: b'["b\'99\'" "b\'0.067\'"]' 

順便說一句,我也看到了​​,它解釋了b角色,但我不認爲這是他問。

由第一個答案提出附加的故障排除步驟:

data = np.loadtxt(file, delimiter="\tb'", dtype=str) 

返回:

array(["b'Time\\tPercent'", "b'99\\t0.067'", "b'99\\t0.133'", 
     "b'99\\t0.067'", "b'99\\t0'", "b'99\\t0'", "b'0\\t0.5'", 
     "b'0\\t0.467'", "b'0\\t0.857'", "b'0\\t0.5'", "b'0\\t0.357'", 
     "b'0\\t0.533'", "b'5\\t0.467'", "b'5\\t0.467'", "b'5\\t0.125'", 
     "b'5\\t0.4'", "b'5\\t0.214'", "b'5\\t0.4'", "b'10\\t0.067'", 
     "b'10\\t0.067'", "b'10\\t0.333'", "b'10\\t0.333'", "b'10\\t0.133'", 
     "b'10\\t0.133'", "b'15\\t0.267'", "b'15\\t0.286'", "b'15\\t0.333'", 
     "b'15\\t0.214'", "b'15\\t0'", "b'15\\t0'", "b'20\\t0.267'", 
     "b'20\\t0.2'", "b'20\\t0.267'", "b'20\\t0.437'", "b'20\\t0.077'", 
     "b'20\\t0.067'", "b'25\\t0.133'", "b'25\\t0.267'", "b'25\\t0.412'", 
     "b'25\\t0'", "b'25\\t0.067'", "b'25\\t0.133'", "b'30\\t0'", 
     "b'30\\t0.071'", "b'30\\t0'", "b'30\\t0.067'", "b'30\\t0.067'", 
     "b'30\\t0.133'"], 
     dtype='<U16') 

回答

1

感謝大家看看我的問題。我重新啓動了IPython,現在能夠執行相同的代碼而沒有任何問題。這是與上面相同的代碼。

data_float = np.loadtxt(file, delimiter='\t', dtype=float, skiprows=1) 

結果:

In [1]: data_float 
Out[1]: 
array([[ 9.90000000e+01, 6.70000000e-02], 
     [ 9.90000000e+01, 1.33000000e-01], 
     [ 9.90000000e+01, 6.70000000e-02], 
     [ 9.90000000e+01, 0.00000000e+00], 
     [ 9.90000000e+01, 0.00000000e+00], 
     [ 0.00000000e+00, 5.00000000e-01], 
     [ 0.00000000e+00, 4.67000000e-01], 
     [ 0.00000000e+00, 8.57000000e-01], 
     [ 0.00000000e+00, 5.00000000e-01], 
     [ 0.00000000e+00, 3.57000000e-01], 
     [ 0.00000000e+00, 5.33000000e-01], 
     [ 5.00000000e+00, 4.67000000e-01], 
     [ 5.00000000e+00, 4.67000000e-01], 
     [ 5.00000000e+00, 1.25000000e-01], 
     [ 5.00000000e+00, 4.00000000e-01], 
     [ 5.00000000e+00, 2.14000000e-01], 
     [ 5.00000000e+00, 4.00000000e-01], 
     [ 1.00000000e+01, 6.70000000e-02], 
     [ 1.00000000e+01, 6.70000000e-02], 
     [ 1.00000000e+01, 3.33000000e-01], 
     [ 1.00000000e+01, 3.33000000e-01], 
     [ 1.00000000e+01, 1.33000000e-01], 
     [ 1.00000000e+01, 1.33000000e-01], 
     [ 1.50000000e+01, 2.67000000e-01], 
     [ 1.50000000e+01, 2.86000000e-01], 
     [ 1.50000000e+01, 3.33000000e-01], 
     [ 1.50000000e+01, 2.14000000e-01], 
     [ 1.50000000e+01, 0.00000000e+00], 
     [ 1.50000000e+01, 0.00000000e+00], 
     [ 2.00000000e+01, 2.67000000e-01], 
     [ 2.00000000e+01, 2.00000000e-01], 
     [ 2.00000000e+01, 2.67000000e-01], 
     [ 2.00000000e+01, 4.37000000e-01], 
     [ 2.00000000e+01, 7.70000000e-02], 
     [ 2.00000000e+01, 6.70000000e-02], 
     [ 2.50000000e+01, 1.33000000e-01], 
     [ 2.50000000e+01, 2.67000000e-01], 
     [ 2.50000000e+01, 4.12000000e-01], 
     [ 2.50000000e+01, 0.00000000e+00], 
     [ 2.50000000e+01, 6.70000000e-02], 
     [ 2.50000000e+01, 1.33000000e-01], 
     [ 3.00000000e+01, 0.00000000e+00], 
     [ 3.00000000e+01, 7.10000000e-02], 
     [ 3.00000000e+01, 0.00000000e+00], 
     [ 3.00000000e+01, 6.70000000e-02], 
     [ 3.00000000e+01, 6.70000000e-02], 
     [ 3.00000000e+01, 1.33000000e-01]]) 
+0

這是我的意見,我很樂意刪除它,但你能解釋爲什麼第一個? – Bobby

+0

我現在解決了它,看到我發佈的答案,我也可以刪除整個問題,因爲答案是微不足道的,但也許它會幫助別人。 – Bobby

+1

刪除問題:它的偏離主題。 m SO ------密切彈出。這個問題是由於無法再現的問題或簡單的印刷錯誤造成的。雖然類似的問題可能在這裏討論,但這個問題的解決方式不太可能有助於未來的讀者。這通常可以通過識別並密切檢查在發佈之前重現問題所需的最短程序來避免。 – Merlin

1

你能嘗試:

data = np.loadtxt(file, delimiter="\tb'", dtype=str) 

,以表明實際的分隔符似乎包含字符「b」?

+0

這工作沒有錯誤,但看起來不正確。我現在要回答這個問題。 – Bobby

+0

>>>浮動(b'42' ) 是不是一個問題,但你正在處理什麼用, >>>浮動(「b'42' 」) 是不一樣的事情,錯誤出與 ValueError:無法將字符串轉換爲浮點數:「b'18'」 –

+0

剛更新的問題與您的建議的輸出。 – Bobby

1

的問題是,您的號碼被引用。也就是說,該字段是'99',而不是99。有兩種方法可以做到這一點。您可以提供剝離報價並返回浮動的轉換器功能。或者,您可以使用csv模塊加載數據,然後將該數據傳遞給numpy

使用轉換器功能

import numpy as np 
from io import StringIO 

data = """'x'\t'y' 
'1'\t'2.5'""" 

arr = np.loadtxt(StringIO(data), dtype=float, delimiter="\t", skiprows=1, 
    converters=dict.fromkeys([0, 1], (lambda s: float(s.strip(b"'")))) 
) 

使用csv

import csv 
import numpy as np 
from io import StringIO 

data = """'x'\t'y' 
'1'\t'2.5'""" 

reader = csv.reader(StringIO(data), quotechar="'", delimiter="\t") 
next(reader) # skip headers 
arr = np.array(list(reader), dtype=float) 

在這兩個例子中我已經使用StringIO,所以你可以很容易地看到 「文件」 的內容。您當然可以將文件名或文件對象傳遞給這些函數。

相關問題