【问题标题】:Convert list of numpy.float64 to float in Python quickly将 numpy.float64 列表快速转换为 Python 中的浮点数
【发布时间】:2015-05-26 20:45:43
【问题描述】:

将 numpy.float64 类型的元素列表转换为 float 类型的最快方法是什么?我目前正在使用简单的for loop 迭代和float()

我遇到了这篇文章:Converting numpy dtypes to native python types,但是我的问题不是如何在 python 中转换类型,而是更具体地说,如何在 python 中以最快的方式将一个类型的整个列表最好地转换为另一种类型(即在这种特定情况下 numpy.float64 浮动)。我希望有一些我没有遇到过的秘密 python 机器可以一次完成所有工作:)

【问题讨论】:

  • 只是要清楚 - 这是一个 Python 列表,还是一个 dtype np.float64 的 numpy 数组?您在列表上使用列表推导,在数组上使用数组方法(例如astype)。
  • @hpaulj 这是一个 python 列表

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


【解决方案1】:

tolist() 方法应该做你想做的事。如果你有一个 numpy 数组,只需调用 tolist():

In [17]: a
Out[17]: 
array([ 0.        ,  0.14285714,  0.28571429,  0.42857143,  0.57142857,
        0.71428571,  0.85714286,  1.        ,  1.14285714,  1.28571429,
        1.42857143,  1.57142857,  1.71428571,  1.85714286,  2.        ])

In [18]: a.dtype
Out[18]: dtype('float64')

In [19]: b = a.tolist()

In [20]: b
Out[20]: 
[0.0,
 0.14285714285714285,
 0.2857142857142857,
 0.42857142857142855,
 0.5714285714285714,
 0.7142857142857142,
 0.8571428571428571,
 1.0,
 1.1428571428571428,
 1.2857142857142856,
 1.4285714285714284,
 1.5714285714285714,
 1.7142857142857142,
 1.857142857142857,
 2.0]

In [21]: type(b)
Out[21]: list

In [22]: type(b[0])
Out[22]: float

如果,事实上,你真的有 numpy.float64 对象的 python 列表,那么@Alexander 的答案很好,或者你可以将列表转换为数组,然后使用 tolist() 方法。例如

In [46]: c
Out[46]: 
[0.0,
 0.33333333333333331,
 0.66666666666666663,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

In [47]: type(c)
Out[47]: list

In [48]: type(c[0])
Out[48]: numpy.float64

@Alexander 的建议,列表推导:

In [49]: [float(v) for v in c]
Out[49]: 
[0.0,
 0.3333333333333333,
 0.6666666666666666,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

或者,转换为数组,然后使用tolist() 方法。

In [50]: np.array(c).tolist()
Out[50]: 
[0.0,
 0.3333333333333333,
 0.6666666666666666,
 1.0,
 1.3333333333333333,
 1.6666666666666665,
 2.0]

如果您关心速度,这里有一个比较。输入 x 是一个 numpy.float64 对象的 Python 列表:

In [8]: type(x)
Out[8]: list

In [9]: len(x)
Out[9]: 1000

In [10]: type(x[0])
Out[10]: numpy.float64

列表理解的时机:

In [11]: %timeit list1 = [float(v) for v in x]
10000 loops, best of 3: 109 µs per loop

转换为numpy数组然后tolist()的时间:

In [12]: %timeit list2 = np.array(x).tolist()
10000 loops, best of 3: 70.5 µs per loop

因此将列表转换为数组然后调用tolist()会更快。

【讨论】:

    【解决方案2】:

    所以在我遇到的可能的解决方案中(非常感谢Warren WeckesserAlexander 指出了所有可能的最佳方法)我运行了我当前的方法以及Alexander 提出的方法来给出一个运行时的简单比较(这两个选择是因为我有一个真实的 numpy.float64 元素列表并希望快速将它们转换为浮点数):

    涵盖了 2 种方法:列表理解和基本 for 循环迭代

    首先是代码:

    import datetime
    import numpy
    
    list1 = []
    for i in range(0,1000):
        list1.append(numpy.float64(i))
    list2 = []
    t_init = time.time()
    for num in list1:
        list2.append(float(num))
    t_1 = time.time()
    list2 = [float(np_float) for np_float in list1]
    t_2 = time.time()
    
    print("t1 run time: {}".format(t_1-t_init))
    print("t2 run time: {}".format(t_2-t_1))
    

    我跑了四次来快速给出一组结果:

    >>> run 1
    t1 run time: 0.000179290771484375
    t2 run time: 0.0001533031463623047
    Python 3.4.0
    
    >>> run 2
    t1 run time: 0.00018739700317382812
    t2 run time: 0.0001518726348876953
    Python 3.4.0
    
    >>> run 3
    t1 run time: 0.00017976760864257812
    t2 run time: 0.0001513957977294922
    Python 3.4.0
    
    >>> run 4
    t1 run time: 0.0002455711364746094
    t2 run time: 0.00015997886657714844
    Python 3.4.0
    

    显然要将一个真正的numpy.float64列表转换为float,最佳做法是使用python的列表推导。

    【讨论】:

    • 我更新了我的答案,比较了列表理解的时间和转换为数组的时间,然后是tolist()
    【解决方案3】:

    您可以使用列表推导:

    floats = [float(np_float) for np_float in np_float_list]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-04
      • 2015-03-20
      • 2019-01-10
      • 2021-06-04
      • 2014-05-26
      • 2016-08-17
      • 2018-09-25
      相关资源
      最近更新 更多