增量构建numpy数组的最有效方法是什么,例如一次一行,事先不知道最终尺寸?
我的用例如下。我需要加载一个大文件(10-100M行),每行需要字符串处理,并应形成一行numpy数组。
将数据加载到临时Python列表并转换为数组是否更好?numpy中是否存在一些可以提高效率的现有机制?
答案 0 :(得分:7)
除了将每行附加到列表然后转换为ndarray之外,您应该获得更好的性能。
这是一个测试,我将ndarrays附加到列表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问题。你可以通过分块来避免这种情况。
答案 1 :(得分:2)
在我的笔记本电脑上1核心intel i5 1.7 GHz:
%%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