<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
NumPy,是 Numerical Python 的簡稱,用於高效能科學計算和資料分析的基礎包,像數學科學工具(pandas)和框架(Scikit-learn)中都使用到了 NumPy 這個包。
NumPy 中的基本資料結構是ndarray
或者 N 維數值陣列,在形式上來說,它的結構有點像 Python 的基礎型別——Python列表。
但本質上,這兩者並不同,可以看到一個簡單的對比。
我們建立兩個列表,當我們建立好了之後,可以使用 +
運運算元進行連線:
list1 = [i for i in range(1,11)] list2 = [i**2 for i in range(1,11)] print(list1+list2) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
列表中元素的處理感覺像物件,不是很數位,不是嗎? 如果這些是數位向量而不是簡單的數位列表,您會期望 + 運運算元的行為略有不同,並將第一個列表中的數位按元素新增到第二個列表中的相應數位中。
接下來看一下 Nympy 的陣列版本:
import numpy as np arr1 = np.array(list1) arr2 = np.array(list2) arr1 + arr2 # array([ 2, 6, 12, 20, 30, 42, 56, 72, 90, 110])
通過 numpy 的np.array
陣列方法實現了兩個列表內的逐個值進行相加。
我們通過dir
函數來看兩者的區別,先看 Python 內建列表 list1
的內建方法:
再用同樣的方法看一下 arr1中的方法:
NumPy 陣列物件還有更多可用的函數和屬性。 特別要注意諸如mean
、std
和sum
之類的方法,因為它們清楚地表明重點關注使用這種陣列物件的數值/統計計算。 而且這些操作也很快。
NumPy 的速度要快得多,因為它的向量化實現以及它的許多核心例程最初是用 C 語言(基於 CPython 框架)編寫的。 NumPy 陣列是同構型別的密集排列的陣列。 相比之下,Python 列表是指向物件的指標陣列,即使它們都屬於同一型別。 因此,我們得到了參考區域性性的好處。
許多 NumPy 操作是用 C 語言實現的,避免了 Python 中的迴圈、指標間接和逐元素動態型別檢查的一般成本。 特別是,速度的提升取決於您正在執行的操作。 對於資料科學和 ML 任務,這是一個無價的優勢,因為它避免了長和多維陣列中的迴圈。
讓我們使用 @timing
計時裝飾器來說明這一點。 這是一個圍繞兩個函數 std_dev
和std_dev_python
包裝裝飾器的程式碼,分別使用 NumPy 和本機 Python 程式碼實現列表/陣列的標準差計算。
我們可以使用 Python 裝飾器和functools
模組的wrapping
來寫一個 時間裝飾器timing
:
def timing(func): @wraps(func) def wrap(*args, **kw): begin_time = time() result = func(*args, **kw) end_time = time() print(f"Function '{func.__name__}' took {end_time-begin_time} seconds to run") return result return wrap
然後利用這個時間裝飾器來看 Numpy 陣列和 Python 內建的列表,然後計算他們的標準差,
公式如圖:
std_dev()
,numpy
模組中內建了標準差公式的函數 a.std()
,我們可以直接呼叫s
average
sumsq
sumsq
的平均值 sumsq_average
result
程式碼如下:
from functools import wraps from time import time import numpy as np from math import sqrt def timing(func): @wraps(func) def wrap(*args, **kw): begin_time = time() result = func(*args, **kw) end_time = time() # print(f"Function '{func.__name__}' with arguments {args},keywords {kw} took {end_time-begin_time} seconds to run") print(f"Function '{func.__name__}' took {end_time-begin_time} seconds to run") return result return wrap @timing def std_dev(a): if isinstance(a, list): a = np.array(a) s = a.std() return s @timing def std_dev_python(lst): length = len(lst) s = sum(lst) average = s / length sumsq = 0 for i in lst: sumsq += (i-average)**2 sumsq_average = sumsq/length result = sqrt(sumsq_average) return result
執行結果,最終可以看到 1000000 個值得標準差的值為 288675.13459,而 Numpy 計算時間為 0.0080 s,而 Python 原生計算方式為 0.2499 s:
由此可見,Numpy 的方式明顯更快。
NumPy 是專門針對陣列的操作和運算進行了設計,所以陣列的儲存效率和輸入輸出效能遠優於Python中的巢狀列表,陣列越大,NumPy的優勢就越明顯。
到此這篇關於NumPy 與 Python 內建列表計算標準差區別詳析的文章就介紹到這了,更多相關Python 內建列表內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45