2 回答

TA貢獻1864條經驗 獲得超2個贊
你的方法:
In [18]: arr = np.array([])
In [19]: for i in range(1000):
...: arr = np.insert(arr, arr.shape[0],[1,2,3])
...:
In [20]: arr.shape
Out[20]: (3000,)
In [21]: %%timeit
...: arr = np.array([])
...: for i in range(1000):
...: arr = np.insert(arr, arr.shape[0],[1,2,3])
...:
31.9 ms ± 194 μs per loop (mean ± std. dev. of 7 runs, 10 loops each)
將其與concatenate:
In [22]: %%timeit
...: arr = np.array([])
...: for i in range(1000):
...: arr = np.concatenate((arr, [1,2,3]))
...:
5.49 ms ± 20.6 μs per loop (mean ± std. dev. of 7 runs, 100 loops each)
并帶有列表擴展:
In [23]: %%timeit
...: alist = []
...: for i in range(1000):
...: alist.extend([1,2,3])
...: arr = np.array(alist)
384 μs ± 13.2 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
我們不鼓勵使用concatenate(or np.append),因為它很慢,而且很難初始化。列表追加或擴展更快。你的使用insert比concatenate.
concatenate每次都創建一個全新的數組。 insert也是如此,但因為它旨在將新值放在原始值的任何位置,所以它要復雜得多,因此速度較慢。如果你不相信我,看看它的代碼。
lists專為成長而設計;新項目通過簡單的對象(指針)插入到具有增長增長的緩沖區中來添加。也就是說,增長就地發生。
插入一個完整的數組也很不錯:
In [27]: %%timeit
...: arr = np.zeros((1000,3),int)
...: for i in range(1000):
...: arr[i,:] = [1,2,3]
...: arr = arr.ravel()
1.69 ms ± 9.47 μs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
添加回答
舉報