代码之家  ›  专栏  ›  技术社区  ›  ShanZhengYang

ValueError:无法将字符串转换为float---如何将字符串列表转换为numpy数组类型float?

  •  0
  • ShanZhengYang  · 技术社区  · 6 年前

    看起来我在Python3.x中有一个格式不正确的numpy数组——它被保存为字符串列表。

    foo = [[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]
      [1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]
    

    np.float32 进入numpy数组:

    np.asarray(foo, dtype=np.float32)
    

    ValueError: could not convert string to float:[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06] [7.2646574e-06 7.1252006e-06 3.0184277e-01 ... 1.0048618e-05 3.1828706e-06 1.0196264e-06]..]
    

    try2 = np.asarray(map(np.float32, foo))
    

    但它在一个支架上卡住了:

    ValueError: could not convert string to float: [
    

    4 回复  |  直到 6 年前
        1
  •  2
  •   pault Tanjin    6 年前

    如果用逗号替换空格,则可以使用 json.loads 以列表形式读取字符串,并将其传递给 np.asarray

    import json
    import numpy as np
    
    foo = "[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06] \
    [1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06]]"
    
    a = np.asarray(json.loads(foo.replace(" ", ",")), dtype=np.float32)
    print(a)
    #array([[7.0352220e-01, 5.3130367e-06, 1.5167372e-05, 1.0797821e-06],
    #       [1.3130367e-06, 2.4584832e-01, 2.2375602e-05, 7.3299240e-06]])
    
    print(a.dtype)
    #float32
    

    这假设值之间正好有一个空格。如果不是这样,你可以用 re.sub 要用逗号替换多个空格,请执行以下操作:

    import re
    a = np.asarray(json.loads(re.sub("\s+", ",", foo)))
    #array([[7.0352221e-01, 5.3130366e-06, 1.5167372e-05, 1.0797821e-06],
    #       [1.3130367e-06, 2.4584831e-01, 2.2375601e-05, 7.3299238e-06]],
    #      dtype=float32)
    
        2
  •  1
  •   Prometheus    6 年前

    据我所知,np.asarray()是有效的 只有 数据类型与初始数据类型具有不同的数据类型。请试着去掉那个论点,看看它是否有效。

        3
  •  1
  •   Tarifazo    6 年前

    foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
           ['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06']]
    arr = np.array([[value.split() for value in row][0] for row in foo], dtype='<f8')
    

    (注意:[0]用作split,用于创建列表本身。您可以使用np.reforme(可选)

    foo = '[[7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06][7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06]'
    arr=np.array([line.split() for line in foo.replace('[','').replace(']]','').split(']')], dtype='<f8')
    
        4
  •  1
  •   Franco D'Angelo    6 年前

    鉴于:

    foo = [['7.0352220e-01 5.3130367e-06 1.5167372e-05 1.0797821e-06'],
           ['1.3130367e-06 2.4584832e-01 2.2375602e-05 7.3299240e-06'], 
           ['7.2646574e-06 7.1252006e-06 3.0184277e-01 1.0048618e-05']]
    

    foo = [row[i].split() for row in foo for i in range(len(foo[0]))]
    

    这用于将类型更改为浮动。

    foo = [[float(row[i]) for i in range(len(foo[0]))] for row in foo]
    
    print(type(foo[0][1]))
    
    >> float
    

    然后把它变成一个numpy数组:

    foo = np.array(foo)
    
    print(type(foo[0][1]))
    
    >> numpy.float64