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]

Last updated