小編寫這篇文章的目的,主要是給大家來做一個比較詳細的解答,解答一下其具體的相關知識,還有一些相關的代碼解析,下面就給大家進行一個比較詳細的解答。
什么是Numpy
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數組和Python內置計算對比
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內置的列表,然后計算他們的標準差,
公式如圖:
定義Numpy計算標準差的函數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的方式明顯更快。
5總結
NumPy是專門針對數組的操作和運算進行了設計,所以數組的存儲效率和輸入輸出性能遠優于Python中的嵌套列表,數組越大,NumPy的優勢就越明顯。
綜上所述,相關內容解答就為大家介紹這里了,希望可以給各位讀者帶來幫助。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/127780.html
小編寫這篇文章的主要目的,主要是給大家進行介紹,關于NumPy與Python內置列表計算標準差區別的相關介紹,希望可以給各位讀者帶來幫助。 1什么是Numpy NumPy,是NumericalPython的通稱,用以性能卓越計算機的應用和數據統計分析的前提包,像數理科學專用工具(pandas)和架構(Scikit-learn)中都采用上了NumPy這個包。 NumPy中的基本數據結構是n...
摘要:下文統一稱為數組是存儲單一數據類型的多維數組同語言數組直接保存數值而則是能夠對數組進行處理的函數。動態數據類型與的數組和的這些不可變數據類型的適用場景等可變數據類型適用于需要不斷對原始數據進行修改的場景。 showImg(https://segmentfault.com/img/remote/1460000018925396);Numpy,是python中的一個矩陣計算包,功能類似ma...
摘要:鋪墊已了,進入今天的正題,貓薦書系列之五高性能編程本書適合已入門還想要進階和提高的讀者閱讀。書中列舉了兩個慘痛的教訓華爾街公司騎士資本由于軟件升級引入的錯誤,損失億美元公司小時全球中斷的嚴重事故。 showImg(https://segmentfault.com/img/bVbm92w?w=6720&h=4480); 稍微關心編程語言的使用趨勢的人都知道,最近幾年,國內最火的兩種語言非...
摘要:鋪墊已了,進入今天的正題,貓薦書系列之五高性能編程本書適合已入門還想要進階和提高的讀者閱讀。書中列舉了兩個慘痛的教訓華爾街公司騎士資本由于軟件升級引入的錯誤,損失億美元公司小時全球中斷的嚴重事故。 showImg(https://segmentfault.com/img/bVbm92w?w=6720&h=4480); 稍微關心編程語言的使用趨勢的人都知道,最近幾年,國內最火的兩種語言非...
閱讀 911·2023-01-14 11:38
閱讀 878·2023-01-14 11:04
閱讀 740·2023-01-14 10:48
閱讀 1982·2023-01-14 10:34
閱讀 942·2023-01-14 10:24
閱讀 819·2023-01-14 10:18
閱讀 499·2023-01-14 10:09
閱讀 572·2023-01-14 10:02