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

Python 如何从大量数据高效地构造numpy数组?,python,arrays,numpy,Python,Arrays,Numpy,如果我在内存中有一个巨大的列表列表,并且我希望将其转换为一个数组,那么这种天真的方法是否会导致python复制所有数据,占用内存两倍的空间?我是否应该转换列表列表,一个向量一个向量地转换,而不是通过弹出 # for instance list_of_lists = [[...], ..., [...]] arr = np.array(list_of_lists) 编辑: 是否最好创建一个已知大小的空数组,然后以增量方式填充它,从而完全避免使用list\u-of-list对象?这可以通过一些简单

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

# for instance
list_of_lists = [[...], ..., [...]]
arr = np.array(list_of_lists)
编辑:
是否最好创建一个已知大小的空数组,然后以增量方式填充它,从而完全避免使用
list\u-of-list
对象?这可以通过一些简单的方法来实现吗,比如
some\u array[i]=一些\u float\u值的列表?

我只是在这里打个比方,因为它的注释有点长

你有没有读过numpy的文档

numpy.array(对象,dtype=None,copy=True,order=None,subok=False,ndmin=0)
"""
...
副本:bool,可选
如果为true(默认值),则复制对象。否则,将创建副本
仅当_数组_返回副本时,如果obj是嵌套序列,
或者如果需要副本来满足任何其他要求(数据类型,
订单等)。
...
"""
当您在创建
numpy
数组时说不想复制原始数组的数据时,您希望最终得到什么样的数据结构

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

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

如果您使用
np.array(my_2D\u python\u array,copy=False)
我不知道它实际会产生什么,但是您可以自己轻松地测试它。看看阵列的形状,看看它包含什么样的对象

但是,如果您希望numpy数组是连续的,那么在某些情况下,您必须分配它所需的所有内存(如果它像您所建议的那样大,听起来可能很难找到足够大的连续部分)

很抱歉,这是一个很随意的评论。您正在查看的实际阵列有多大

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

from __future__ import division

#Make a large python 2D array
N, M = 10000, 18750
print "%i x %i = %i doubles = %f GB" % (N, M, N * M, N*M*8/10**9)

#grab pid to moniter memory and cpu usage
import os
pid = os.getpid()

os.system("python moniter.py -p " + str(pid) + " &")


print "building python matrix"
large_2d_array = [[n + m*M for n in range(N)] for m in range(M)]


import numpy
from datetime import datetime

print datetime.now(), "creating numpy array with copy"
np1 = numpy.array(large_2d_array, copy=True)
print datetime.now(), "deleting array"
del(np1)


print datetime.now(), "creating numpy array with copy"
np1 = numpy.array(large_2d_array, copy=False)
print datetime.now(), "deleting array"
del(np1)

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


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

注意
numpy数组
和python
列表
是完全不同的概念。如果您有时间,我建议您看看这本出版物:。它大约是1.5gb 10k x 150k,但我应该能够逐个向量构建numpy数组向量?然后它会重新启动很多次吗?我不知道如何实现这一点,但我不需要或不想同时使用
列表和numpy数组;32位整数为6GB,双精度为12GB。不,我指的是字节。浮点向量是150kb:)它只有30+k浮点值,好的!!那很好。我现在只是看看不同方法的用法。我将很快加入一些绘图。您可以始终构建numpy数组,然后只需
del(列表的列表)