Python新手:从文件读取双列数据并拆分至两个独立数组的报错及数据类型问题
搞定numpy加载文件的两个问题:拆分数组与字符串类型
嘿,作为Python新手遇到这种numpy的小坑很正常,我来一步步帮你解决:
1. 为什么x,y = np.loadtxt(...)会报错?
当你用dtype=[('mystring','S4'),('myint','i8')]时,np.loadtxt返回的是一个结构化数组,它本质是包含8行数据的数组,而不是两个独立的数组——你用x,y去解包,相当于要把8个元素拆成2个,自然会报ValueError: too many values to unpack。
有两种方式解决拆分问题:
方式一:先读结构化数组,再提取字段
先把整个数据读成结构化数组,再通过字段名分别取出两列:
import numpy as np # 注意把'S4'改成'U4',后面会说原因 data = np.loadtxt("Equadgrams.txt", dtype=[('mystring', 'U4'), ('myint', 'i8')]) # 提取两个独立数组 grams = data['mystring'] counts = data['myint']
方式二:用unpack=True直接拆分
如果想一步到位,不用结构化dtype,直接指定两个类型,再加上unpack=True参数,让numpy自动把每一列拆成独立数组:
import numpy as np grams, counts = np.loadtxt("Equadgrams.txt", dtype=('U4', 'i8'), unpack=True)
2. 为什么字符串是b'TION'类型?
你用的'S4'是numpy的字节字符串类型(对应numpy.bytes_),这是Python 2的遗留类型。在Python 3中,我们需要用'U4'(U代表Unicode字符串,4是字符串最大长度)作为dtype,这样读取出来的就是普通的Python str类型,不会带b前缀了。
最终效果验证
用上面的代码处理你的文件后,grams会是:
array(['TION', 'NTHE', 'THER', 'THAT', 'OFTH', 'FTHE', 'THES', 'WITH'], dtype='<U4')
counts会是:
array([13168375, 11234972, 10218035, 8980536, 8132597, 8100836, 7717675, 7627991])
完全符合你要的两个独立数组的需求~
内容的提问来源于stack exchange,提问作者ATYslh
相关产品推荐
相关产品推荐

