逐步构建numpy数组的最佳方法是什么?

时间:2015-05-26 20:39:15

标签: python arrays numpy

增量构建numpy数组的最有效方法是什么,例如一次一行,事先不知道最终尺寸?

我的用例如下。我需要加载一个大文件(10-100M行),每行需要字符串处理,并应形成一行numpy数组。

将数据加载到临时Python列表并转换为数组是否更好?numpy中是否存在一些可以提高效率的现有机制?

2 个答案:

答案 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