我有一些数据,我想读入一个numpy数组。数据采用字符串格式。一行的格式为
' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00'
我想将字符串分解为五个单独的数字。如果所有数字之间有空格,这很简单。不幸的是,在数字为负数的情况下更难,因为负数和前面的数字之间没有空格。减号不仅出现在负数前面。有时,指数为负数,如上面第一个数字所示。有没有快速的方法将上面的行解析为五个单独的数字?
这是我目前拥有的代码的MWE
import pandas as pd
data1 = pd.read_csv('datafile.csv')
dim1 = 5
geometryparameters = np.zeros(dim1,dtype=float)
c=data1.iloc[1,0] # Just taking the first row, which is in string format
csplit = c.split(" ") # Splitting the string into parts
for it1 in np.arange(dim1):
geometryparameters[it1] = float(csplit[it1]) # converting the string into float
由于上面提到的减号问题,上述代码在某些情况下失败。
答案 0 :(得分:3)
如果您无法修改输入,因为数字始终以E+/-xx
结尾,您可以在遇到此模式时使用正则表达式插入空格(使用正则表达式),然后拆分&转换为浮动:
import re
s = ' 0.600759893E-02 0.000000000E+00-0.112325850E-02 0.000000000E+00 0.000000000E+00'
result = [float(x) for x in re.sub("(E[+\-]\d\d)",r"\1 ",s).split()]
print(result)
(使用捕获搜索E<sign> and 2 digits
并替换相同的内容(\1
)加空格。
收率:
[0.00600759893, 0.0, -0.0011232585, 0.0, 0.0]
编辑:只使用正则表达式findall
更快,没有str.split
:
result = [float(x) for x in re.findall(r"\b.*?E[+\-]\d\d",s)]
寻找一个单词(注意左边的单词边界,非贪婪或者它将匹配多于1个数字),以及右边的指数表达式。
答案 1 :(得分:2)
根据您的信息,每个数字字段长度恰好为16个字符。因此每行长度为80个字符。
因此,对于每一行,x将是5个数字的列表:
x = [float(line[n:n+16]) for n in range(0,80,16)]