Dal*_*lek 3 python arrays numpy
我有一个ascii文件,我想把它读成一个numpy array.但它失败了,对于文件中的第一个数字,它在我使用时返回'NaN' numpy.genfromtxt.然后我尝试使用以下方式将文件读入数组:
lines = file('myfile.asc').readlines()
X = []
for line in lines:
s = str.split(line)
X.append([float(s[i]) for i in range(len(s))])
Traceback (most recent call last):
File "<stdin>", line 3, in <module>
ValueError: could not convert string to float: 15.514
Run Code Online (Sandbox Code Playgroud)
当我打印文件的第一行时,它看起来像:
>>> s
['\xef\xbb\xbf15.514', '15.433', '15.224', '14.998', '14.792', '15.564', '15.386', '15.293', '15.305', '15.132', '15.073', '15.005', '14.929', '14.823', '14.766', '14.768', '14.789']
Run Code Online (Sandbox Code Playgroud)
我怎么能把这样一个文件读成numpy array没有问题和关于行数和列数的假设?
基于@fattru的答案,我想提供一个Numpy文件读取功能的解决方案:
import numpy as np
import codecs
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
X = np.loadtxt(f)
Run Code Online (Sandbox Code Playgroud)
它使用正确的编码将文件加载到打开的文件实例中.Numpy使用这种句柄(它也可以使用句柄,open()并且像其他情况一样工作.
该文件采用带 BOM 的 utf-8 编码。codecs.open与编码一起使用utf-8-sig以正确处理它(排除 BOM \xef\xbb\xbf)。
import codecs
X = []
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
for line in f:
s = line.split()
X.append([float(s[i]) for i in range(len(s))])
Run Code Online (Sandbox Code Playgroud)
更新您根本不需要使用索引:
with codecs.open('myfile.asc', encoding='utf-8-sig') as f:
X = [[float(x) for x in line.split()] for line in f]
Run Code Online (Sandbox Code Playgroud)
顺便说一句,如果没有特殊原因str.split(line),请不要使用未绑定方法。line.split()