【问题标题】:How to convert string datatypes to float in numpy arrays in Python 3如何在 Python 3 中将字符串数据类型转换为浮点数
【发布时间】:2016-10-24 09:35:00
【问题描述】:

我使用 Python 2.7 已经有一段时间了,最​​近切换到了 Python 3。我已经在某些方面更新了我的代码,但是我目前遇到的问题让我感到困惑。我要做的是使用 np.loadtxt 加载数据集。因为此数据还包含字符串,所以我将整个数组作为字符串导入。我想在将一些条目转换为浮点数之后进行类型转换。这惨遭失败,我不明白为什么。我所看到的是,在 Python 3 中,所有字符串都有前缀“b”,我觉得这与此有关,但我找不到简明的答案。下面的代码和错误。

    filename = 'train.csv'
    raw_data = open(filename, 'rb')
    data = np.loadtxt(raw_data, delimiter=",", dtype = 'str')
    dataset = data[1:,1:]
    print(dataset)
    original_data = dataset
    test = float(dataset[0,0])
    print(test)

结果

    [["b'60'" "b'RL'" "b'65'" ..., "b'WD'" "b'Normal'" "b'208500'"]
     ["b'20'" "b'RL'" "b'80'" ..., "b'WD'" "b'Normal'" "b'181500'"]
     ["b'60'" "b'RL'" "b'68'" ..., "b'WD'" "b'Normal'" "b'223500'"]
     ..., 
     ["b'70'" "b'RL'" "b'66'" ..., "b'WD'" "b'Normal'" "b'266500'"]
     ["b'20'" "b'RL'" "b'68'" ..., "b'WD'" "b'Normal'" "b'142125'"]
     ["b'20'" "b'RL'" "b'75'" ..., "b'WD'" "b'Normal'" "b'147500'"]]
    ---------------------------------------------------------------------------
    ValueError                                Traceback (most recent call last)
    <ipython-input-38-c154945cd6f1> in <module>()
          5 print(dataset)
          6 original_data = dataset
    ----> 7 test = float(dataset[0,0])
          8 print(test)

    ValueError: could not convert string to float: "b'60'"

【问题讨论】:

  • 嗨 Sem,您可能不必首先打开文件,但可以将文件名传递给 loadtxt。此外,您可能想尝试更强大的解析数据的 numpy.genfromtxt。除此之外,您能否提供数据文件中的示例行?
  • 嗨,dnalow,使用 genfromtxt 已经修复了它。谢谢你的评论!将在下面发布答案。亲切的问候,Sem

标签: arrays string python-3.x numpy type-conversion


【解决方案1】:

正如 dnalow 所建议的,类型转换出现问题,因为我首先打开文件然后从中读取。解决方案是不使用 open open(filename, 'rb') 和 np.loadtxt,而是使用 np.genfromtxt。代码如下。

    filename = 'train.csv'
    data = np.genfromtxt(filename, delimiter=",", dtype = 'str')
    dataset = data[1:,1:]
    print(dataset)
    original_data = dataset
    test = float(dataset[0,0])
    print(test)
    filename = 'train.csv'
    data = np.genfromtxt(filename, delimiter=",", dtype = 'str')
    dataset = data[1:,1:]
    print(dataset)
    original_data = dataset
    test = float(dataset[0,0])
    print(test)

结果

    [['60' 'RL' '65' ..., 'WD' 'Normal' '208500']
     ['20' 'RL' '80' ..., 'WD' 'Normal' '181500']
     ['60' 'RL' '68' ..., 'WD' 'Normal' '223500']
     ..., 
     ['70' 'RL' '66' ..., 'WD' 'Normal' '266500']
     ['20' 'RL' '68' ..., 'WD' 'Normal' '142125']
     ['20' 'RL' '75' ..., 'WD' 'Normal' '147500']]
    60.0

【讨论】:

  • 顺便说一句。您也可以尝试不指定 dtype。我认为 genfromtext 将尝试自动类型转换并返回结构化数组。但是,结构化数组的用法与 ndarray 的用法有些不同,因此可能不是您想要的。
  • dtype=None做实验;并阅读结构化数组。
猜你喜欢
  • 2011-03-10
  • 2015-01-18
  • 1970-01-01
  • 2011-11-25
  • 2019-07-10
  • 1970-01-01
  • 2019-07-03
  • 2018-03-18
相关资源
最近更新 更多