我有一个numpy数组,我可以使用append简单地追加一个项目,如下所示:
numpy.append(myarray, 1)
在这种情况下,我只是附加了整数1
.
但这是附加到阵列的最快方法吗?我有一个非常长的阵列,成千上万.
或者更好的索引数组并直接分配它?像这样:
myarray[123] = 1
Roger Fan.. 14
附加到numpy数组是非常低效的.这是因为解释器需要在每一步都找到并为整个数组分配内存.根据应用程序,有更好的策略.
如果你事先知道的长度,最好是预先分配使用的功能,如阵列np.ones
,np.zeros
或np.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
因此,您可以看到预分配和使用列表然后转换都要快得多.