Gök*_*ver 10 python unicode numpy
考虑一个名为"new.txt"的文本文件,其中包含以下元素:
?m
?r
??
Run Code Online (Sandbox Code Playgroud)
在Python 2.7中,我可以通过键入以下内容来读取文件:
>>> import codecs
>>> f = codecs.open('new.txt', encoding='utf-8')
>>> lines = [line.strip() for line in f2.readlines()]
>>> lines
[u'\u03bcm', u'\u2202r', u'\u2206\u03bb']
>>> print lines[0]
?m
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我可以通过以下方式轻松将此列表转换为numpy数组:
>>> import numpy as np
>>> arr = np.array(lines)
>>> arr
array([u'\u03bcm', u'\u2202r', u'\u2206\u03bb'],
dtype='<U2')
Run Code Online (Sandbox Code Playgroud)
问题是,我无法通过numpy的loadtxt函数直接读取此文件:
>>> np.loadtxt('new.txt', dtype=np.unicode_)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib64/python2.7/site-packages/numpy/lib/npyio.py", line 805, in loadtxt
X = np.array(X, dtype)
UnicodeDecodeError: 'ascii' codec can't decode byte 0xce in position 0: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
将此文件直接读入numpy的正确方法是什么?
谢谢.
Sve*_*ach 10
在内存中,unicode字符串表示为UCS-2或UCS-4,具体取决于Python解释器的编译方式.您的文件以UTF-8编码,因此您需要在将其映射到NumPy阵列之前对其进行重新编码. loadtxt()
不能为你做记录 - 毕竟NumPy主要针对数值数组.
假设每一行都有相同数量的字符,您也可以使用更有效的变体
s = codecs.open("new.txt", encoding="utf-8").read()
arr = numpy.frombuffer(s, dtype="<U3")
Run Code Online (Sandbox Code Playgroud)
这将包括字符串中的换行符.要不包含它们,请使用
arr = numpy.frombuffer(s.replace("\n", ""), dtype="<U2")
Run Code Online (Sandbox Code Playgroud)
编辑:如果您的文件行具有不同的长度,并且您希望避免使用中间列表,则可以使用
arr = numpy.fromiter(codecs.open("new.txt", encoding="utf-8"), dtype="<U2")
Run Code Online (Sandbox Code Playgroud)
不过,我不确定这是否会在内部创建一些临时列表.
归档时间: |
|
查看次数: |
15900 次 |
最近记录: |