我正在从文件中读取行,然后使用它们。每行仅由浮点数组成。
我几乎将所有内容都整理成将数据转换为数组。
我基本上做(伪拷贝码)
line=file.readlines()
line=line.split(' ') # Or whatever separator
array=np.array(line)
#And then iterate over every value casting them as floats
newarray[i]=array.float(array[i])
这有效,但似乎有点违反直觉和反麻风,我想知道是否有更好的方法来处理来自文件的输入,最后有一个充满浮点数的数组。
答案 0 :(得分:7)
快速回答:
arrays = []
for line in open(your_file): # no need to use readlines if you don't want to store them
# use a list comprehension to build your array on the fly
new_array = np.array((array.float(i) for i in line.split(' ')))
arrays.append(new_array)
如果您经常处理此类数据,csv模块将提供帮助。
import csv
arrays = []
# declare the format of you csv file and Python will turn line into
# lists for you
parser = csv.reader(open(your_file), delimiter=' '))
for l in parser:
arrays.append(np.array((array.float(i) for i in l)))
如果你觉得狂野,你甚至可以完全声明:
import csv
parser = csv.reader(open(your_file), delimiter=' '))
make_array = lambda row : np.array((array.float(i) for i in row))
arrays = [make_array(row) for row in parser]
如果你真的希望你的同事讨厌你,你可以制作一个班轮(不是所有的PYTHONIC: - ):
arrays = [np.array((array.float(i) for i in r)) for r in csv.reader(open(your_file), delimiter=' '))]
剥离所有锅炉板和柔韧性,最终可以得到一个干净且易读的衬里。我不会使用它,因为我喜欢使用csv
的反应潜力,但它可能是好的。这是一个灰色区域,所以我不会说它是Pythonic,但它确实很方便。
arrays = [np.array((array.float(i) for i in l.split())) for l in open(your_file))]
答案 1 :(得分:6)
If you want a numpy array and each row in the text file has the same number of values:
a = numpy.loadtxt('data.txt')
没有numpy:
with open('data.txt') as f:
arrays = list(csv.reader(f, delimiter=' ', quoting=csv.QUOTE_NONNUMERIC))
with open('data.txt') as f:
arrays = [map(float, line.split()) for line in f]
答案 2 :(得分:3)
以下内容如何:
import numpy as np
arrays = []
for line in open('data.txt'):
arrays.append(np.array([float(val) for val in line.rstrip('\n').split(' ') if val != '']))
答案 3 :(得分:1)
一种可能的单线:
a_list = [map(float, line.split(' ')) for line in a_file]
请注意,我在这里使用了map()
而不是嵌套列表理解来帮助提高可读性。
如果你想要一个numpy数组:
an_array = np.array([map(float, line.split(' ')) for line in a_file])
答案 4 :(得分:0)
我会使用正则表达式
导入重新
all_lines = ''.join( file.readlines() )
new_array = np.array( re.findall('[\d.E+-]+', all_lines), float)
np.reshape( new_array, (m,n) )
首先将文件合并为一个长字符串,然后仅提取与浮点数对应的表达式('[\ d.E + - ]'用于科学计数法,但您也可以使用 '[\ d。]'仅用于浮点表达式。)