Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将对象列表转换为numpy数组的更快方法_Python_Arrays_Numpy - Fatal编程技术网

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

Python 将对象列表转换为numpy数组的更快方法,python,arrays,numpy,Python,Arrays,Numpy,我试图通过使用numpy数组删除for循环和列表理解来优化代码。 一般来说,现在代码的执行速度更快了,但有一件事让我非常困扰:将包含大约110000个元素的列表转换为numpy数组需要花费程序运行时的大部分时间(5到7秒,只是初始化数组!) 我有这个 rec = np.array(records) 其中记录是对象列表 有没有可能加快这个numpy数组的创建速度?python存储对象(例如记录中的项)的方式与numpy不同。因此,为了创建numpy数组,需要访问每个元素,然后进行转换 正如@an

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

我有这个

rec = np.array(records)
其中
记录
是对象列表


有没有可能加快这个numpy数组的创建速度?

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格式而不是文本格式存储。如果一个数据库,考虑保存二进制值(但是这在很大程度上取决于应用程序的其余部分)

如果你的列表是一维的,使用<代码> NP.FrutMeMe()/>代码比典型的<代码> NP.ARARY()/<代码>要快。 大小为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)

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

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

使用CodeTimer(“convert np.array”):tcc_obs=np.asarray(tcc_obs) 对于一个形状阵列:(72575996)~53m元素 代码块“convert np.array”耗时:161秒


如果有人有办法做得更好。从逻辑上讲,最好使用布尔数组子集netcdf变量,然后转换一个较小的数组,但是代码使用一些numpy函数作为isin来查找两个表中的公共索引,这对于python数组来说是没有等价物的。

为什么要先创建一个列表,然后将其转换为numpy数组,如果可能的话,创建一个numpy数组,因为数据来自django中的sqlite数据库,所以我得到的记录在一个QuerySet中…可能类似于这些记录是什么样的?