2014-09-03 67 views
6

我有一个numpy的阵列,我可以使用追加,像这样的项目只是附加到它:最佳的方式追加到numpy的阵列

numpy.append(myarray, 1) 

在这种情况下我刚所附整数1

但这是追加到数组最快的方法?我有一个很长的阵列,数以万计。

或者索引数组并直接赋值会更好吗? 像这样:

myarray[123] = 1 

回答

9

追加到numpy的阵列是非常低效的。这是因为解释器需要在每一步中为整个阵列查找和分配内存。根据应用情况,有更好的策略。

如果您事先知道长度,最好使用np.ones,np.zerosnp.empty等函数预先分配阵列。

desired_length = 500 
results = np.empty(desired_length) 
for i in range(desired_length): 
    results[i] = i**2 

如果您不知道长度,那么将结果保留在常规列表中并将其转换为数组可能会更有效。

results = [] 
while condition: 
    a = do_stuff() 
    results.append(a) 
results = np.array(results) 

这里是我的计算机上的某些时刻。

def pre_allocate(): 
    results = np.empty(5000) 
    for i in range(5000): 
     results[i] = i**2 
    return results 

def list_append(): 
    results = [] 
    for i in range(5000): 
     results.append(i**2) 
    return np.array(results) 

def numpy_append(): 
    results = np.array([]) 
    for i in range(5000): 
     np.append(results, i**2) 
    return results 

%timeit pre_allocate() 
# 100 loops, best of 3: 2.42 ms per loop 

%timeit list_append() 
# 100 loops, best of 3: 2.5 ms per loop 

%timeit numpy_append() 
# 10 loops, best of 3: 48.4 ms per loop 

所以你可以看到,预先分配和使用列表,然后转换更快。

1

如果您在运行结束时知道数组的大小,那么预先分配适当大小的数组然后设置值会快得多。如果您确实需要即时添加,最好尽量不要一次完成这一个元素,而应尽可能多地添加以避免重复生成多个副本。您可能还需要对np.append,np.hstack,np.concatenate的时间差异进行分析。等等。