python技巧(1)–如何转换itertools.chain对象为数组

  • 2020 年 2 月 19 日
  • 筆記

总第 115 篇文章,本文大约 900 字,阅读大约需要 3 分钟

之前做1月总结的时候说过希望每天或者每2天开始的更新一些学习笔记,这是开始的第一篇。

这篇介绍的是如何把一个 itertools.chain 对象转换为一个数组。

参考 stackoverflow 上的一个回答:Get an array back from an itertools.chain object,链接如下:

https://stackoverflow.com/questions/26853860/get-an-array-back-from-an-itertools-chain-object

例子:

list_of_numbers = [[1, 2], [3], []]  import itertools  chain = itertools.chain(*list_of_numbers)

解决方法有两种:

第一种比较简单,直接采用 list 方法,如下所示:

list(chain)

但缺点有两个:

  • 会在外层多嵌套一个列表
  • 效率并不高

第二个就是利用 numpy 库的方法 np.fromiter,示例如下:

>>> import numpy as np  >>> from itertools import chain  >>> list_of_numbers = [[1, 2], [3], []]  >>> np.fromiter(chain(*list_of_numbers), dtype=int)  array([1, 2, 3])  

对比两种方法的运算时间,如下所示:

>>> list_of_numbers = [[1, 2]*1000, [3]*1000, []]*1000  >>> %timeit np.fromiter(chain(*list_of_numbers), dtype=int)  10 loops, best of 3: 103 ms per loop  >>> %timeit np.array(list(chain(*list_of_numbers)))  1 loops, best of 3: 199 ms per loop

可以看到采用 numpy 方法的运算速度会更快。