Python中高效转换itertools.chain对象为数组的两种方法
本文详细介绍在Python中将itertools.chain对象转换为数组的两种常用方法。第一种直接使用list(),操作简单但存在嵌套列表且效率较低的问题;第二种推荐利用numpy库的np.fromiter()函数,通过指定数据类型实现更高效的转换。通过代码示例与时间对比,验证了numpy方法在处理大规模数据时的速度优势,为开发者提供性能更优的解决方案。
在1月总结中曾提到,计划每天或每两天更新一篇学习笔记,这是系列更新的第一篇。
itertools.chain对象转数组的方法
本文主要讲解如何将itertools.chain对象转换为数组。
参考来源为StackOverflow上的回答:Get an array back from an itertools.chain object,具体链接如下:
https://stackoverflow.com/questions/26853860/get-an-array-back-from-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方法的运算速度明显更快。
itertools.chain()方法补充
补充说明:以下介绍itertools模块中chain()方法的相关用法。
# -*- coding:utf-8 -*-
from itertools import chain
from random import randint
# 随机生成 19 个整数(在 60 到 100 之间)
c1 = [randint(60, 100) for _ in range(19)]
# 随机生成 24 个整数(在 60 到 100 之间)
c2 = [randint(60, 100) for _ in range(24)]
# 随机生成 42 个整数(在 60 到 100 之间)
c3 = [randint(60, 100) for _ in range(42)]
# 随机生成 22 个整数(在 60 到 100 之间)
c4 = [randint(60, 100) for _ in range(22)]
count = 0
# chain()可以把一组迭代对象串联起来,形成一个更大的迭代器
for s in chain(c1, c2, c3, c4):
if s > 90:
count += 1
print('4 个班单科成绩大于 90 分的人次为', count)
总结
以上介绍了Python中转换itertools.chain对象为数组的方法,希望内容对大家有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













