小编写这篇文章的目的,主要是给大家来做一个比较详细的解答,解答一下其具体的相关知识,还有一些相关的代码解析,下面就给大家进行一个比较详细的解答。
什么是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的优势就越明显。
综上所述,相关内容解答就为大家介绍这里了,希望可以给各位读者带来帮助。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/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); 稍微关心编程语言的使用趋势的人都知道,最近几年,国内最火的两种语言非...
阅读 912·2023-01-14 11:38
阅读 879·2023-01-14 11:04
阅读 743·2023-01-14 10:48
阅读 1997·2023-01-14 10:34
阅读 945·2023-01-14 10:24
阅读 823·2023-01-14 10:18
阅读 500·2023-01-14 10:09
阅读 573·2023-01-14 10:02