亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

numpy.insert 的性能取決于數組大小 - 解決方法?

numpy.insert 的性能取決于數組大小 - 解決方法?

繁星coding 2021-11-23 16:22:36
使用以下代碼,我的印象是插入到 numpy 數組中取決于數組大小。是否有針對此性能限制的任何基于 numpy 的解決方法(或也不是基于 numpy 的)?if True:    import numpy as np    import datetime    import timeitmyArray = np.empty((0, 2), dtype='object')myString = "myArray = np.insert(myArray, myArray.shape[0], [[ds, runner]], axis=0)"runner = 1ds = datetime.datetime.utcfromtimestamp(runner)% timeit myString19.3 ns ± 0.715 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)for runner in range(30_000):    ds = datetime.datetime.utcfromtimestamp(runner)    myArray = np.insert(myArray, myArray.shape[0], [[ds, runner]], axis=0)print("len(myArray):", len(myArray))% timeit myStringlen(myArray): 3000038.1 ns ± 1.1 ns per loop (mean ± std. dev. of 7 runs, 10000000 loops each)
查看完整描述

2 回答

?
哆啦的時光機

TA貢獻1779條經驗 獲得超6個贊

這與numpy工作方式有關。對于每個插入操作,它都會獲取整個數組并將其存儲在一個新位置。我建議使用listappend 并將其轉換為numpy數組。也許這個問題的重復


查看完整回答
反對 回復 2021-11-23
?
慕斯王

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)


查看完整回答
反對 回復 2021-11-23
  • 2 回答
  • 0 關注
  • 289 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號