Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/332.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_List_Numpy_In Place - Fatal编程技术网

将Python列表转换为Numpy数组

将Python列表转换为Numpy数组,python,arrays,list,numpy,in-place,Python,Arrays,List,Numpy,In Place,我有一个巨大的python列表(16GB),我想把它转换成numpy数组。我负担不起这种说法 huge_array = np.array(huge_list).astype(np.float16) 我正在寻找一些有效的方法来将这个巨大的\u列表转换为numpy数组,而无需复制 有人能提出一个有效的方法来做到这一点吗?这可能需要先将列表保存到磁盘,然后将其作为numpy数组加载,我同意 我将非常感谢任何帮助 编辑1:maging_list是在运行时创建的内存中python列表,因此它已经占用了1

我有一个巨大的python列表(16GB),我想把它转换成numpy数组。我负担不起这种说法

huge_array = np.array(huge_list).astype(np.float16)
我正在寻找一些有效的方法来将这个
巨大的\u列表
转换为
numpy数组
,而无需复制

有人能提出一个有效的方法来做到这一点吗?这可能需要先将列表保存到磁盘,然后将其作为numpy数组加载,我同意

我将非常感谢任何帮助


编辑1:
maging_list
是在运行时创建的内存中python列表,因此它已经占用了16GB的空间。我需要将其转换为
numpy float16
array。

如前所述,最简单的方法是将数组转储到一个文件中,然后将该文件作为numpy数组加载

首先,我们需要庞大列表的大小:

huge_list_size = len(huge_list)
接下来,我们将其转储到磁盘

dumpfile = open('huge_array.txt', 'w')

for item in huge_list:
    dumpfile.write(str(item)+"\n")
dumpfile.close()
如果这一切都发生在同一个环境中,请确保清除内存

del huge_list
接下来,我们定义一个简单的读取生成器

def read_file_generator(filename):
    with open(filename) as infile:
        for i, line in enumerate(infile):
            yield [i, line]
然后我们创建一个由零组成的numpy数组,我们用刚刚创建的生成器填充它

huge_array = np.zeros(huge_list_size, dtype='float16')

for i, item in read_file_generator('huge_array.txt'):
    huge_array[i] = item
我以前的回答不正确。我建议以下是一个解决方案,但它并不像

您可以通过多种方式来实现这一点,最简单的方法就是转储 将数组加载到文件,然后将该文件作为numpy数组加载:

dumpfile = open('huge_array.txt', 'w')

for item in huge_array:
  print>>dumpfile, item
然后将其作为numpy数组加载

huge_array = numpy.loadtxt('huge_array.txt')
如果您想对这些数据执行进一步的计算,您也可以 使用用于memmapping的joblib库,这在中非常有用 处理大型numpy数组计算。可在

np.array(庞大的列表,dtype=np.float16)
将更快,因为它只复制列表一次,而不是两次


您可能不必担心制作此副本,因为副本比原件小得多:

>>> x = [float(i) for i in range(10000)]
>>> sys.getsizeof(x)
83112
>>> y = np.array(x, dtype=np.float16)
>>> sys.getsizeof(y)
20096
但这还不是最糟糕的——在python列表中,列表中的每个数字都占用了自己的内存:

>>> sum(sys.getsizeof(i) for i in x)
240000

所以numpy阵列要小约15倍

您可以使用
numpy
save
load
功能:

您可以使用普通python列表作为
np.save
的参数,而
np.load
将直接加载到numpy数组中

例如:


您是否排除了np.save和np.load?这是
np.array
方法花费的时间太长,还是会产生内存错误?我关心的是内存,而不是速度。因此np.array可能抛出内存错误@DanPatterson巨大的U列表不在磁盘上,它是在运行时生成的内存中的列表,然后我必须将其转换为numpy float16array@Ahmed:生成列表的是什么?你能直接生成一个数组吗?@Eric列表是以增量方式生成的,我们事先没有它的大小。所以它是由list.append()方法生成的。由于numpy数组是不可变的,因此直接制作numpy数组并没有任何意义,因为它不会节省内存。内存是这里的首要问题,速度是次要问题。这使用了
np.array(大列表)。view(np.float16)
的1/5内存,假设
大列表
包含用于指出这一点的floatsthank,我已经纠正了这一点,但关键是,我的机器安装了32GB内存。列表的大小是16GB(float16),我不想通过创建另一个16GB副本而使内存溢出。@Ahmed:副本不会是16GB
x=[1.0]*100
sys.getsizeof(x)==864
sys.getsizeof(np.array(x,dtype=np.float16))==296
但是
loadtxt
将值加载到一个列表中,并在所有值加载后执行
np.array(alist)
。我在numpy 1.10.4中检查了np.loadtxt的源代码以确保。在loadtxt方法的npyio中的第808行,确实指定了列表并在不久之后读取,在第936行,通过“np.array(X,dtype)”调用将列表转换为numpy数组。谢谢,我不知道。我将尽快调整我的答案,使之符合承诺的答案。我确实同意hpaulj的观点,即分块可能是一个更好的解决方案,但这必须在数据生成过程中完成,并且不能回答这个问题。
from tempfile import TemporaryFile
outfile = TemporaryFile()
x = [1, 2, 3]
np.save(outfile, x)

outfile.seek(0)
np.load(outfile)