繁体   English   中英

将对象列表转换为 numpy 数组的更快方法

[英]Faster way to convert list of objects to numpy array

我正在尝试通过使用 numpy 数组删除 for 循环和列表理解来优化我的代码。 总的来说,现在代码的执行速度更快了,但是有一件事情让我很困扰:将我的包含大约 110000 个元素的列表转换为一个 numpy 数组需要程序运行时的大部分时间(5 到 7 秒,只是为了初始化一个数组!)

我有这个

rec = np.array(records)

其中records是对象列表。

是否可以加快创建这个 numpy 数组的速度?

如果您的列表是一维的,则使用np.fromiter()比典型的np.array()更快。 大小为 10000 的整数列表的基准测试:

a = [1,2,3,4,5,6,7,8,9,10]*1000

%timeit np.array(a,dtype=np.int32)
456 µs ± 7.16 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

%timeit np.fromiter(a,dtype=np.int32,count=10000)
242 µs ± 6.65 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

python 存储对象(例如记录中的项目)的方式与 numpy 不同。 因此,为了创建 numpy 数组,需要访问每个元素然后进行转换。

正如@anmol_uppoal 的评论所暗示的那样,您应该希望从一开始就创建一个 numpy 数组。 例如

rec = np.zeros((SIZE_OF_ARRAY,))
# Set values of rec in the same way you created records, for instance
for i in range(100):
    rec[i] = i+1

获得进一步优化将与数据的来源相关联——如果来自文件,请尝试以 numpy 格式而不是文本格式存储。 如果是数据库,请考虑保存二进制值(但这在很大程度上取决于应用程序的其余部分)

在读取数据时,它通常不会以 numpy 数组的形式出现。 具有绑定 java 或 python 的 netcdf 库,用于处理 HDF5 或变体中的多变量、多文件数据集。 它使用内部优化的数组类型,而不是 numpy 类型,因此转换是不可避免的。

例如,从 netcdf 数据集转换需要几分钟。 逐步计时显示这只是需要时间的转换

with CodeTimer("convert np.array"): tcc_obs = np.asarray(tcc_obs)

对于一个形状数组:(725, 759, 96) ~53 M 个元素代码块“convert np.array”需要:161 s

如果有人有办法让它变得更好。 从逻辑上讲,最好用布尔数组对 netcdf 变量进行子集化,然后转换一个较小的数组,但代码使用一些 numpy 函数作为 isin 来查找两个表中的公共索引,我不知道 python 数组的等效项。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM