将 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 倍!
您可以使用 numpy
的 save
和 load
函数:
您可以使用普通 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)
我有一个很大的 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 倍!
您可以使用 numpy
的 save
和 load
函数:
您可以使用普通 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)