numpy-genfromtxt在Python3中发布



我正在尝试将genfromtxt与Python3一起使用,以读取包含字符串和数字的简单csv文件。例如,类似(以下简称"test.csv"(:

1,a
2,b
3,c

使用Python2,以下操作效果良好:

import numpy
data=numpy.genfromtxt("test.csv", delimiter=",", dtype=None)
# Now data is something like [(1, 'a') (2, 'b') (3, 'c')]

在Python3中,相同的代码返回CCD_。这在某种程度上是意料之中的,因为Python3读取文件的方式不同。因此,我使用转换器来解码字符串:

decodef = lambda x: x.decode("utf-8")
data=numpy.genfromtxt("test.csv", delimiter=",", dtype="f8,S8", converters={1: decodef})

这适用于Python 2,但不适用于Python 3(相同的[(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'模式,如本链接中所建议的,但没有任何改进。

为什么转换器在只读取一列时工作,而在读取两列时不工作?你能告诉我在Python 3中使用genfromtxt的正确方法吗?我做错什么了吗?提前谢谢!

我的问题的答案是将dtype用于unicode字符串(例如U2(。

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

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数据类型文档页面上也可以找到有用的信息。

在python 3中,编写

dtype="S8">

(或"S#"的任何变体(生成一个字节字符串。为了避免这种情况,只得到一个老式的字符串,写

dtype=str

相反。

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

在我的例子中,第一列包含一个0或1的情感值,第二列是一个由许多字符组成的字符串,表示这个例子中的推特。dtype='U'删除了b'。

因此,在您的情况下,它将是:data=numpy.genfromttxt("test.csv",分隔符=",",dtype='U'(

相关内容

  • 没有找到相关文章

最新更新