如何从大量数据中高效地构造numpy数组?

2024-06-17 18:57:09 发布

您现在位置:Python中文网/ 问答频道 /正文

如果我在内存中有一个庞大的列表列表,并希望将其转换为数组,那么这种天真的方法是否会导致python复制所有数据,占用内存空间的两倍?我应该转换一个列表列表吗,一个向量一个向量,而不是弹出?在

# for instance
list_of_lists = [[...], ..., [...]]
arr = np.array(list_of_lists)

编辑: 创建一个已知大小的空数组,然后以增量方式填充它,从而完全避免list_of_lists对象,是否更好?这是否可以通过简单的some_array[i] = some_list_of_float_values来实现?在


Tags: of数据方法instance内存列表forsome
1条回答
网友
1楼 · 发布于 2024-06-17 18:57:09

我只是把他们放在这里,因为评论有点长。在

你读过^{}的numpy文档了吗?在

numpy.array(object, dtype=None, copy=True, order=None, subok=False, ndmin=0)
"""
...
copy : bool, optional
  If true (default), then the object is copied. Otherwise, a copy will
  only be made if __array__ returns a copy, if obj is a nested sequence,
  or if a copy is needed to satisfy any of the other requirements (dtype,
  order, etc.).
...
"""

当您说在创建numpy数组时,您不希望复制原始数组的数据,那么您希望得到什么样的数据结构?在

使用numpy可以大大提高速度,因为创建的C数组在内存中是连续的。python中的数组只是一个指向对象的指针数组,因此每次都必须查找对象-numpy中不是这样,因为它不是用python编写的。在

如果您只想让numpy数组引用2D数组中的python数组,那么您将失去性能增益。在

如果你做了np.array(my_2D_python_array, copy=False)我不知道它实际会产生什么,但是你可以很容易地自己测试它。看看这个阵列的形状,看看它容纳了什么样的对象。在

但是,如果您希望numpy数组是连续的,那么在某个时刻,您将不得不分配它所需的所有内存(如果它像您所建议的那样大,听起来可能很难找到足够大的连续部分)。在

抱歉,那是很杂乱,只是一个评论。你看到的实际数组有多大?在

下面是一个小示例程序的cpu使用率和内存使用率的曲线图:

^{pr2}$

enter image description here

1、2和3是每个矩阵完成创建的点。请注意,本机python数组比numpy数组占用更多的内存——python对象每个都有自己的开销,列表是对象的列表。对于numpy数组,情况并非如此,因此它要小得多。在

还要注意,在python对象上使用副本没有任何效果-总是会创建新数据。您可以通过创建python对象的numpy数组(使用dtype=object)来解决这个问题,但我不建议这样做。在

相关问题 更多 >