如果我在内存中有一个庞大的列表列表,并希望将其转换为数组,那么这种天真的方法是否会导致python复制所有数据,占用内存空间的两倍?我应该转换一个列表列表吗,一个向量一个向量,而不是弹出?在
# for instance
list_of_lists = [[...], ..., [...]]
arr = np.array(list_of_lists)
编辑:
创建一个已知大小的空数组,然后以增量方式填充它,从而完全避免list_of_lists
对象,是否更好?这是否可以通过简单的some_array[i] = some_list_of_float_values
来实现?在
我只是把他们放在这里,因为评论有点长。在
你读过^{} 的numpy文档了吗?在
当您说在创建
numpy
数组时,您不希望复制原始数组的数据,那么您希望得到什么样的数据结构?在使用
numpy
可以大大提高速度,因为创建的C数组在内存中是连续的。python中的数组只是一个指向对象的指针数组,因此每次都必须查找对象-numpy
中不是这样,因为它不是用python编写的。在如果您只想让
numpy
数组引用2D数组中的python数组,那么您将失去性能增益。在如果你做了
np.array(my_2D_python_array, copy=False)
我不知道它实际会产生什么,但是你可以很容易地自己测试它。看看这个阵列的形状,看看它容纳了什么样的对象。在但是,如果您希望numpy数组是连续的,那么在某个时刻,您将不得不分配它所需的所有内存(如果它像您所建议的那样大,听起来可能很难找到足够大的连续部分)。在
抱歉,那是很杂乱,只是一个评论。你看到的实际数组有多大?在
下面是一个小示例程序的cpu使用率和内存使用率的曲线图:
^{pr2}$1、2和3是每个矩阵完成创建的点。请注意,本机python数组比numpy数组占用更多的内存——python对象每个都有自己的开销,列表是对象的列表。对于numpy数组,情况并非如此,因此它要小得多。在
还要注意,在python对象上使用副本没有任何效果-总是会创建新数据。您可以通过创建python对象的numpy数组(使用
dtype=object
)来解决这个问题,但我不建议这样做。在相关问题 更多 >
编程相关推荐