Numpy
Numpy是一个多维数组,能提供最大值,最小值,中位数,百分位,全距,算术平均值,加权平均值,标准差,方差;基本上完整的提供了集中趋势的量度,分散性和变异度的量度。
什么是Numpy?
Numpy就是N维数据,是前边讲的序列列表
的替代品;据说是用C语言写的独立的模块,效率较高;
首先安装一下numpy库,使用前要导入一下numpy库(怎么在Thonny里导入numpy库?
);
'''
Welcome to LearnPython.NET
File Name: PNumpy.py
Download from: https://www.learnpython.net/cn/python-code-samples.html
Author: LearnPython.Net
Editor: CoderChiu
'''
import numpy as np
如何创建Numpy数组(ndarry)?
可以先创建一个列表,然后通过列表来创建ndarrry;Lukas,Robin,Alex一起去惠州大亚湾的黄金海岸旅游,在老虎洲岸边上的沙滩上,Lukas捉到了5只螃蟹,Robin捉到了7只螃蟹,Alex捉到了4只螃蟹;看一下我们如何用Numpy中的ndarry 来展示的。
#捉到的小朋友数量;
nListCabNum = [5,7,4]
npArrayCabNum = np.array(nListCabNum)
print("npArrayCabNum = ", npArrayCabNum)
print("type = ", type(npArrayCabNum))
先创建一个列表 nListCabNum
,在通过 nListCabNum
来创建 ndarray数组 npArrayCabNum
,看一下ndarray数组的数据内容和数据类型是什么(numpy.ndarray
)。
>>> %Run PNumpy.py
npArrayCabNum = [5 7 4]
type = <class 'numpy.ndarray'>
还有那些方法来创建ndarray呢?
这么多的初始化函数,才是体现ndarray强大的地方;但为什么需要这么多的初始化函数,一开始我其实也不懂,硬着头皮往下继续看,看到最后我才懂了,不由得感叹有如此牛逼设计思想武装的数组,为Python添彩。
Numpy常用属性
ndarray的常用属性
print("npArrayCabNum = ", npArrayCabNum)
print("share = ", npArrayCabNum.shape)
print("ndim = ", npArrayCabNum.ndim)
print("itemsize = ", npArrayCabNum.itemsize)
print("dtype = ", npArrayCabNum.dtype)
print("size = ", npArrayCabNum.size)
print("data = ", npArrayCabNum.data)
print("type = ", type(npArrayCabNum))
npArrayCabNum
的属性打印如下:
>>> %Run PNumpy.py
npArrayCabNum = [5 7 4]
share = (3,)
ndim = 1
itemsize = 4
dtype = int32
size = 3
data = <memory at 0x0BB6DBF8>
type = <class 'numpy.ndarray'>
NumPy的ndarrray对象支持的数据类型
我猜应该支持的固定长度的信息吧(方便用C语言快速的操作啊);我们看一下到底会支持那些数据类型呢!目前支持 int8, int16, int32,int64,unin8,unin16,unin32,unin64,float16, float32,float64,float128,complex64,complex126,complex256,bool,object,string_,unicode_。
npArrayCabNum = np.array(nListCabNum, dtype=np.int8)
print("dtype = ", npArrayCabNum.dtype)
显式的声明这一次是 np.int8
的ndarray,这时候 dtype 由默认的 int32 变成了 int8。有四个字节的int,变成1个字节的int;在处理大量的数据的时候,还是很有必要的,因为节省四分之三的空间。
>>> %Run PNumpy.py
dtype = int8
NumPy的ndarray对象的矢量化
什么叫矢量化,看看下面的例子就知道了;Lukas,Robin,Alex一起去惠州大亚湾的黄金海岸旅游,在老虎洲岸边上的沙滩上,Lukas捉到了5只螃蟹,Robin捉到了7只螃蟹,Alex捉到了4只螃蟹;假如每个人都可以捉到跟今天一样多的螃蟹,请问一周后,每个人会捉到多少只呢。这不废话吗,每个人乘7不就可以了,对呀,看看ndarray的矢量化运算神奇的地方。
#问一周可以捉到螃蟹呢;
print("After this week: ", npArrayCabNum * 7)
然后就得到了如下数据(是不是还在想怎么 for循环 呢);
>>> %Run PNumpy.py
After this week: [35 49 28]
NumPy中数组ndarray对象之所以很重要,是因为你不需要编写循环即可对数据执行批量运算;大小相等的数组之间任何算术运算都会应用到元素级。假如昨天Lukas捉到了4只螃蟹,Robin捉到了5只螃蟹,Alex捉到了6只螃蟹;如果要计算昨天和今天他们捉了多少只螃蟹,只需要简单的加法就搞定了,没有循环!
#昨天捉到的螃蟹数量;
npArrayCabNumYesterday = np.array([4,5,6], dtype=np.int8)
#昨天+今天螃蟹数量;
print("Sum : ", npArrayCabNum + npArrayCabNumYesterday)
得到结果如下(是不是简化了很多呢,发明NumPy的人,厉害吧!):
>>> %Run PNumpy.py
Sum : [ 9 12 10]
通用函数
以下的函数都是快速的元素级的数据函数;
这个大家比较好理解,简单举个例子,求元素的平方和平方根吧;
npArrayCabNum = np.array(nListCabNum, dtype=np.int8)
#通用函数;
print("square: ", np.square(npArrayCabNum))
print("sqrt: ", np.sqrt(npArrayCabNum))
结果如下:
>>> %Run PNumpy.py
square: [25 49 16]
sqrt: [2.236 2.646 2. ]
数学和统计学方法
数学的方法,可能你大概知道最大值,最小值,算术平均值,元素求和;统计学方法,大概你知道标准差,方差这些吧;
这种方法的好处是常用的数学直接可以得到结果,不要自己动手了;
#捉到的小朋友数量;
nListCabNum = [5,7,4]
npArrayCabNum = np.array(nListCabNum, dtype=np.int8)
print("min: ", npArrayCabNum.min())
print("max: ", npArrayCabNum.max())
print("mean: ", npArrayCabNum.mean())
print("sum: ", npArrayCabNum.sum())
print("std: ", npArrayCabNum.std())
print("var: ", npArrayCabNum.var())
print("argmin: ", npArrayCabNum.argmin())
print("argmax: ", npArrayCabNum.argmax())
print("cumsum: ", npArrayCabNum.cumsum())
print("sumprod: ", npArrayCabNum.cumprod())
得到如下结果:
>>> %Run PNumpy.py
min: 4
max: 7
mean: 5.333333333333333
sum: 16
std: 1.247219128924647
var: 1.5555555555555554
argmin: 2
argmax: 1
cumsum: [ 5 12 16]
sumprod: [ 5 35 140]