将 Python 列表转换为 Numpy 数组就地

Converting Python List to Numpy Array InPlace

我有一个很大的 python 列表 (16 GB),我想将它就地转换为 numpy 数组。我受不起这个说法

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

我正在寻找一些有效的方法来将此 huge_list 转换为 numpy array 而无需复制它。

谁能推荐一种有效的方法来做到这一点?这可能涉及先将列表保存到磁盘,然后将其加载为 numpy 数组,我可以接受。

非常感谢任何帮助。

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

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

没有评论

You can do this in a multiple ways, the easiest would be to just dump the array to a file and then load that file as a numpy array:

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

for item in huge_array:
  print>>dumpfile, item

Then load it as a numpy array

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

If you want to perform further computations on this data you can also use the joblib library for memmapping, which is extremely usefull in handling large numpy array cmputations. Available at https://pypi.python.org/pypi/joblib

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 倍!

您可以使用 numpysaveload 函数:

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

示例:

from tempfile import TemporaryFile
outfile = TemporaryFile()
x = [1, 2, 3]
np.save(outfile, x)

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