我有一个巨大的(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
数组。
答案 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