如何以最高效的方式逐步构建一个numpy数组,例如每次添加一行,而不事先知道最终大小?我的用例如下。我需要加载一个大文件(10-100M行),其中每行都需要字符串处理,并应形成numpy数组的一行。
是将数据加载到临时Python列表中并转换为数组更好,还是numpy中存在某些现有机制可以使其更有效率?
你应该将每一行添加到一个列表中,然后在之后将其转换为ndarray,这样可以获得更好的性能表现。
下面是一个测试,我将ndarray添加到列表中10000次,然后在完成后生成一个新的ndarray:
row = np.random.randint(0,100, size=(1,100))
我使用IPython笔记本计时:
%%timeit
l = [row]
for i in range(10000):
l.append(row)
n = np.array(l)
-> 10次循环,3次测试中最佳结果:每个循环132毫秒
以下是一个测试,在该测试中我连接了每一行:
%%timeit
l = row
for i in range(10000):
l = np.concatenate((l, row),axis=0)
-> 1个循环,3次中最佳: 每个循环23.1秒
慢得多。
第一种方法唯一的问题是你会同时在内存中拥有列表和数组,因此可能会出现RAM问题。您可以通过分块来避免这种情况。
%%timeit
l = [row]
for i in range(10000):
l.append(row)
n = np.array(l)
100 loops, best of 3: 5.54 ms per loop
我尝试使用纯numpy(也许有人知道更好的解决方案)
%%timeit
l = np.empty( (1e5,row.shape[1]) )
for i in range(10000):
l[i] = row
l = l[np.all(l > 1e-100, axis=1)]
10 loops, best of 3: 18.5 ms per loop
numpy.concatenate
жҲ–numpy.vstack
е®ҢжҲҗгҖӮеҚ•дёӘиЎҢзңӢиө·жқҘдјҡжҳҜд»Җд№Ҳж ·еӯҗпјҹ - derricwloadtxt
和genfromtxt
都会逐行收集一个列表的列表,并在最后将其转换为数组。它们的代码是用Python编写的,所以你可以浏览它。 - hpaulj