为了账号安全,请及时绑定邮箱和手机立即绑定

python3中的numpy genfromtxt问题

python3中的numpy genfromtxt问题

幕布斯6054654 2021-03-09 13:13:01
我正在尝试genfromtxt与Python3一起使用,以读取包含字符串和数字的简单csv文件。例如,类似以下内容(以下称为“ test.csv”):1,a2,b3,c使用Python2,以下代码可以很好地工作:import numpydata=numpy.genfromtxt("test.csv", delimiter=",", dtype=None)# Now data is something like [(1, 'a') (2, 'b') (3, 'c')]在Python3中,返回相同的代码[(1, b'a') (2, b'b') (3, b'c')]。由于Python3读取文件的方式不同,所以这在某种程度上是可以预期的。因此,我使用转换器来解码字符串:decodef = lambda x: x.decode("utf-8")data=numpy.genfromtxt("test.csv", delimiter=",", dtype="f8,S8", converters={1: decodef})这适用于Python2,但不适用于Python3(相同的[(1, b'a') (2, b'b') (3, b'c')]输出。但是,如果在Python3中,我使用上面的代码仅读取一列:data=numpy.genfromtxt("test.csv", delimiter=",", usecols=(1,), dtype="S8", converters={1: decodef})输出字符串['a' 'b' 'c']已按预期进行解码。我也试着提供文件的输出open与'rb'模式,在所建议的这个环节,但目前还没有改进。为什么仅读取一列而不读取两列时转换器起作用?您能否建议我genfromtxt在Python3中使用的正确方法?难道我做错了什么?先感谢您!
查看完整描述

3 回答

?
噜噜哒

TA贡献1784条经验 获得超7个赞

我的问题的答案是使用dtypeunicode字符串(U2例如)。

感谢E.Kehler的回答,我找到了解决方案。如果在定义中使用str代替,则第二列的输出为空:S8dtype

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,str')

输出为:

array([(1.0, ''), (2.0, ''), (3.0, '')], dtype=[('f0', '<f16'), ('f1', '<U0')])

这表明我可以正确dtype地解决我的问题的是一个unicode字符串:

numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,U2')

给出预期的输出:

array([(1.0, 'a'), (2.0, 'b'), (3.0, 'c')], dtype=[('f0', '<f16'), ('f1', '<U2')])

有用的信息也可以在numpy数据类型doc页面上找到。


查看完整回答
反对 回复 2021-03-24
?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

在python 3中编写

dtype =“ S8”

(或NumPy的genfromtxt中的“ S#”的任何变体)会产生一个字节字符串。为了避免这种情况,只获取老式字符串,请编写

dtype = str


查看完整回答
反对 回复 2021-03-24
?
波斯汪

TA贡献1811条经验 获得超4个赞

training = np.genfromtxt('twitter_train.csv', delimiter=',', usecols=(0,1), dtype='U')

在我的情况下,第一列包含的情感值为0或1,第二列是一个字符串,由许多字符组成,表示此ex中的一条推文。 dtype ='U '从包含的位置删除了b'。

因此,在您的情况下,它将是:data = numpy.genfromtxt(“ test.csv”,delimiter =“,”,dtype ='U')


查看完整回答
反对 回复 2021-03-24
  • 3 回答
  • 0 关注
  • 218 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信