【问题标题】:numpy genfromtxt issues in Python3Python3 中的 numpy genfromtxt 问题
【发布时间】:2023-04-01 12:53:01
【问题描述】:

我正在尝试将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 中,相同的代码返回 [(1, b'a') (2, b'b') (3, b'c')]。由于 Python3 读取文件的方式不同,这在某种程度上是 expected。因此我使用转换器来解码字符串:

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' 模式,正如this link 所建议的那样,但没有任何改进。

为什么转换器在只读取一列时工作,而不是在读取两列时工作?您能否建议我在 Python3 中使用 genfromtxt 的正确方法?难道我做错了什么?提前谢谢!

【问题讨论】:

  • 这里有什么问题?
  • @wim 已编辑。现在问题应该看起来更清楚了。
  • 这里有同样的问题。起初我对使用 bytes b' 文字而不是预期的字符串感到非常困惑。我有 2 列的 csv 文件:0 或 1 值的情绪;和文本 (UTF-16) 使用这种解码方法分别处理列是可行的

标签: python numpy python-3.x genfromtxt


【解决方案1】:

我的问题的答案是将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')])

也可以在the numpy datatype doc page 找到有用的信息。

【讨论】:

    【解决方案2】:

    在python 3中,写

    dtype="S8"

    NumPy 的 genfromtxt 中的

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

    dtype=str

    改为。

    【讨论】:

    • 感谢您的回答。但是,它并没有解决我的问题,因为使用str 的输出:numpy.genfromtxt("test.csv", delimiter=",", dtype='f8,str') 为第二列中的数据提供了一个空字符串(以及一个dtype&lt;U0)。这帮助我找到了答案(请参阅我的答案)。
    【解决方案3】:
    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')

    【讨论】:

      猜你喜欢
      • 2019-04-08
      • 1970-01-01
      • 2018-06-10
      • 2012-05-10
      • 2013-01-14
      • 2012-11-15
      • 1970-01-01
      • 2016-11-29
      • 2014-02-26
      相关资源
      最近更新 更多