将Python列表转换为Numpy数组InPlace

时间:2016-08-19 06:12:04

标签: python arrays list numpy in-place

我有一个巨大的(16 GB)python列表,我想将它转换为numpy数组,就地。我承担不起这句话

huge_array = np.array(huge_list).astype(np.float16)

我正在寻找一些有效的方法将huge_list转换为numpy array,而不会将其复制。

有人能建议一种有效的方法吗?这可能涉及首先将列表保存到磁盘然后将其加载为numpy数组,我很好。

我非常感谢任何帮助。

编辑1:huge_list是一个内存python列表,它是在运行时创建的,所以它已经占用了16GB。我需要将其转换为numpy float16数组。

3 个答案:

答案 0 :(得分:3)

np.array(huge_list, 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倍!

答案 1 :(得分:2)

正如我之前提到的,最简单的方法是将数组转储到文件中,然后将该文件作为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

我之前的回答是不正确的。我建议以下是一个解决方案,而不是由hpaulj

评论
  

您可以通过多种方式执行此操作,最简单的方法就是转储   将数组添加到文件中,然后将该文件作为numpy数组加载:

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

for item in huge_array:
  print>>dumpfile, item
     

然后将其加载为numpy数组

huge_array = numpy.loadtxt('huge_array.txt')
     

如果您想对此数据进行进一步计算,您也可以   使用joblib库进行memmapping,这非常有用   处理大型numpy数组cmputations。可在   https://pypi.python.org/pypi/joblib

答案 2 :(得分:0)

您可以使用numpy的{​​{1}}和save功能:

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

实施例:

np.load