欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

NumPy?與?Python?內(nèi)置列表計算標(biāo)準(zhǔn)差區(qū)別詳析

 更新時間:2022年07月12日 16:17:19   作者:宇宙之一粟  
這篇文章主要介紹了NumPy與Python內(nèi)置列表計算標(biāo)準(zhǔn)差區(qū)別詳析,NumPy,是Numerical?Python的簡稱,用于高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ)包,更多相關(guān)內(nèi)容需要的朋友可以參考一下

1 什么是 Numpy

NumPy,是 Numerical Python 的簡稱,用于高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ)包,像數(shù)學(xué)科學(xué)工具(pandas)和框架(Scikit-learn)中都使用到了 NumPy 這個包。

NumPy 中的基本數(shù)據(jù)結(jié)構(gòu)是ndarray或者 N 維數(shù)值數(shù)組,在形式上來說,它的結(jié)構(gòu)有點(diǎn)像 Python 的基礎(chǔ)類型——Python列表。

但本質(zhì)上,這兩者并不同,可以看到一個簡單的對比。

我們創(chuàng)建兩個列表,當(dāng)我們創(chuàng)建好了之后,可以使用 +運(yùn)算符進(jìn)行連接:

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]

列表中元素的處理感覺像對象,不是很數(shù)字,不是嗎? 如果這些是數(shù)字向量而不是簡單的數(shù)字列表,您會期望 + 運(yùn)算符的行為略有不同,并將第一個列表中的數(shù)字按元素添加到第二個列表中的相應(yīng)數(shù)字中。

接下來看一下 Nympy 的數(shù)組版本:

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數(shù)組方法實現(xiàn)了兩個列表內(nèi)的逐個值進(jìn)行相加。

我們通過dir 函數(shù)來看兩者的區(qū)別,先看 Python 內(nèi)置列表 list1的內(nèi)置方法:

再用同樣的方法看一下 arr1中的方法:

NumPy 數(shù)組對象還有更多可用的函數(shù)和屬性。 特別要注意諸如mean、stdsum之類的方法,因為它們清楚地表明重點(diǎn)關(guān)注使用這種數(shù)組對象的數(shù)值/統(tǒng)計計算。 而且這些操作也很快。

2 NumPy 數(shù)組和 Python 內(nèi)置計算對比

NumPy 的速度要快得多,因為它的矢量化實現(xiàn)以及它的許多核心例程最初是用 C 語言(基于 CPython 框架)編寫的。 NumPy 數(shù)組是同構(gòu)類型的密集排列的數(shù)組。 相比之下,Python 列表是指向?qū)ο蟮闹羔様?shù)組,即使它們都屬于同一類型。 因此,我們得到了參考局部性的好處。

許多 NumPy 操作是用 C 語言實現(xiàn)的,避免了 Python 中的循環(huán)、指針間接和逐元素動態(tài)類型檢查的一般成本。 特別是,速度的提升取決于您正在執(zhí)行的操作。 對于數(shù)據(jù)科學(xué)和 ML 任務(wù),這是一個無價的優(yōu)勢,因為它避免了長和多維數(shù)組中的循環(huán)。

讓我們使用 @timing計時裝飾器來說明這一點(diǎn)。 這是一個圍繞兩個函數(shù) std_devstd_dev_python包裝裝飾器的代碼,分別使用 NumPy 和本機(jī) Python 代碼實現(xiàn)列表/數(shù)組的標(biāo)準(zhǔn)差計算。

3 函數(shù)計算時間裝飾器

我們可以使用 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

4 標(biāo)準(zhǔn)差計算公式

然后利用這個時間裝飾器來看 Numpy 數(shù)組和 Python 內(nèi)置的列表,然后計算他們的標(biāo)準(zhǔn)差,

公式如圖:

  • 定義 Numpy 計算標(biāo)準(zhǔn)差的函數(shù)std_dev(),numpy 模塊中內(nèi)置了標(biāo)準(zhǔn)差公式的函數(shù) a.std(),我們可以直接調(diào)用
  • 列表計算公式方法需要按照公式一步一步計算:
  • 先求求出宗和s
  • 然后求出平均值average
  • 計算每個數(shù)值與平均值的差的平方,再求和sumsq
  • 再求出sumsq 的平均值 sumsq_average
  • 得到最終的標(biāo)準(zhǔn)差結(jié)果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

運(yùn)行結(jié)果,最終可以看到 1000000 個值得標(biāo)準(zhǔn)差的值為 288675.13459,而 Numpy 計算時間為 0.0080 s,而 Python 原生計算方式為 0.2499 s

由此可見,Numpy 的方式明顯更快。

5 總結(jié)

NumPy 是專門針對數(shù)組的操作和運(yùn)算進(jìn)行了設(shè)計,所以數(shù)組的存儲效率和輸入輸出性能遠(yuǎn)優(yōu)于Python中的嵌套列表,數(shù)組越大,NumPy的優(yōu)勢就越明顯。

到此這篇關(guān)于NumPy 與 Python 內(nèi)置列表計算標(biāo)準(zhǔn)差區(qū)別詳析的文章就介紹到這了,更多相關(guān)Python 內(nèi)置列表內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評論