日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

numpy 笔记 view,copy和numpy的运行速度

發布時間:2025/4/5 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 numpy 笔记 view,copy和numpy的运行速度 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1 ndarray VS python-list

  • ?Numpy 就是 C 的邏輯, 創建存儲容器?Array?的時候是尋找內存上的一段連續空間來存放
  • ?Python 存放的時候則是不連續的區域(只是它用索引將這些區域聯系起來了), 這使得 Python 在索引這個容器里的數據時不是那么有效率

?2 View & Copy

Copy 顧名思義, 會將 Array 中的數據 copy 出來存放在內存中另一個地方

View 不 copy 數據, 而是給源數據加一個窗(視圖),從外面看窗戶里的數據。具體來說,view 不會新建數據,而只是在源數據上建立索引部分

?df1經過view?之后得到的df2全部都是?df1的東西, 動 df2的任何地方, df1?都會受到牽扯, 因為他們在內存中的位置是一模一樣的, 本質上就是自己。

而?df1經過copy?之后得到的df2則是將df1?copy 了一份, 然后把df2?放在內存中的另外的地方, 這樣改變df2,df1?是不會被改變的.

2.1 示例比較view和copy的快慢

?View 只是加了窗,不會復制東西, 速度快!

2.1.1 b=2*b? VS? b*=2

第一個是copy,第二個是view!

b=np.ones(5) print(id(b)) b=b*2 print(id(b)) ''' 1921309681504 1921309680624 ''' b=np.ones(5) print(id(b)) b*=2 print(id(b)) ''' 1921285077472 1921285077472 '''

2.1.2 比較時間

import time t1=time.time() b=np.ones(1000) for i in range(1000):b=b*2 t2=time.time() print(t2-t1) #0.0029931068420410156 b=np.ones(1000) t2=time.time() for i in range(1000):b*=2 t3=time.time() print(t3-t2) #0.001993894577026367

可以看到 view比copy用時要少一些

2.2 示例比較flatten和ravel的快慢

在python包介紹:numpy_UQI-LIUWJ的博客-CSDN博客?中,提到了flatten和ravel

flatten返回一份數據拷貝,對拷貝所做的修改不影響原始數組

ravel和flatten差不多,唯一的區別是,修改會影響原始數組

也就是說,flatten是拷貝,ravel是視圖

import time t1=time.time() b=np.ones(1000) for i in range(1000):b.flatten() t2=time.time() print(t2-t1) #0.0009980201721191406b=np.ones(1000) t2=time.time() for i in range(1000):b.ravel() t3=time.time() print(t3-t2) #0.0009784698486328125

也看得出來,ravel(view)的運行速度比flatten(copy)要快一些

2.3 總結 哪些是view哪些是copy

viewcopy

切片操作 (切片索引不涉及列表)

a[1:2, 3:6] a_view2 = a[:100] a_view3 = a[::2]

切片操作,切片索引涉及列表

a[[1,4,6], [2,4,6]] a[[1,2], :]

布爾索引

a[a[1,:] != 0, :] a[np.isnan(a[:,0]), :] a[[True, True], [False, True]]
a.ravel() a.flatten()
b*=2 b=2*b?

2.4 涉及列表的索引的加速方法——np.take

如果用 index 來選數據, 像?a[[1,4,6], [2,4,6]], 用 take 在大部分情況中會快一些

np.take(ndarray,index_lst)

import time b=np.ones(100).reshape(10,10) t1=time.time() for i in range(1000):b[[1,2,3,4],[5,6,7,8]] t2=time.time() print(t2-t1) #0.0069811344146728516b=np.ones(100).reshape(10,10) lst=[[1,2,3,4],[5,6,7,8]] t2=time.time() for i in range(1000):np.take(b,lst) t3=time.time() print(t3-t2) #0.005984067916870117

參考內容?對速度有潔癖?快來了解 Numpy 的 View 與 Copy - Numpy 數據怪獸 | 莫煩Python (mofanpy.com)

總結

以上是生活随笔為你收集整理的numpy 笔记 view,copy和numpy的运行速度的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。