python支持强大的科学计算功能_python科学计算之Numpy

Numpy的组成与功能

Numpy(Numeric Python)可以被理解为一个用python实现的科学计算包,包括:

1.强大的N维数组对象Array;

2.成熟的函数库;

3.实用的线性代数、傅里叶变换和随机数生成函数。

线性代数是数学的一个分支,它的研究对象是向量,向量空间(或称线性空间),线性变换和有限维的线性方程组。

傅立叶变换,表示能将满足一定条件的某个函数表示成三角函数(正弦和/或余弦函数)或者它们的积分的线性组合。

提供了许多高级的数值编程工具,如矩阵数据类、矢量处理,以及精密的运算库。

为什么要使用数组对象?

1.数组对象可以去掉元素间运算所需的循环,使一维向量更像单个数据

2.设置专门的数组对象,经过优化,可以提升这类应用的运算速度

观察:科学计算中,一个维度所有数据的类型往往相同

3.数组对象采用相同的数据类型,有助于节省运算和存储空间

例:计算a²+b³,其中,a和b是一维数组

基础知识

维度(dimensions)叫做轴(axes 原型:axis)

轴的个数叫做秩(rank)

例如,在3D空间一个点的坐标[1,2,3]是一个秩为1的数据,因为它只有一个轴。轴长度为3.

例如,在[[1.,0.,0.],[0.,1.,2.]]这个例子中,数组的秩为2(它有两个维度)。第一个维度长度为2,第二个维度长度为3.

Numpy的数组类被称作ndarray,通常被称作数组。

ndarray是一个多位数组对象,有两部分构成:

实际的数据

描述这些数据的元数据(数据维度、数据类型)

ndarray数组一般要求所有原属类型相同(同质),数组下标从0开始

注意:numpy.array和标准python库类array.array并不相同,后者只处理一维数组和提供少量功能。

ndarray对象属性主要见下表:例如其中.shape表示数组的维度,.size表示数组元素的个数。

ndarray.ndim  秩,即轴的数量或维度的数量

ndarray.shape  数组的维度,这是一个指示数组在每个维度上大小的整数元祖。(ndarray对象的尺度,对于矩阵,n行m列)

ndarray.size   数组元素的总个数,等于shape属性中元组元素的乘积。(ndarray对象的个数,相当于.shape中n*m的值)

ndarray.itemsize  数组中每个元素字节的大小。

ndarray.dtype   一个用来描述数组中元组类型的对象,可以通过使用标准python类型创造dtype.

ndarray.data      包含实际数组元素的缓冲区,通常我们通过索引引用数组元素,不使用这个属性

ndarray的元素类型

bool        布尔类型,true或false

intc         与c语言中的int类型一致,一般是int32或int64

intp          用于索引的整数,与c语言中ssize_t一致,int32或int64

int8          字节长度的整数,取值:[-128,127]

int16        16位长度的整数,取值:[-32768,32768]

int32          32位长度的整数,取值:[-2^31,2^31-1]

int64          64位长度的整数,取值:[-2^63,2^63-1]

uint8        8位无符号整数,取值:[0,255]

uint16        16位无符号整数,取值:[0,65535]

uint32        32位无符号整数,取值:[0,2^32-1]

uint64        64位无符号整数,取值:[0,2^64-1]

float16       16位半精度浮点数:1位符号位,5位指数,10位尾数

float32      32位半精度浮点数:1位符号位,8位指数,23位尾数

float64      64位半精度浮点数:1位符号位,11位指数,52位尾数

complex64   复数类型,实部和虚部都是32位浮点数

complex128  复数类型,实部和虚部都是64位浮点数

实部(.real)+j虚部(.imag)

ndarray为什么要支持这么多种元素类型?

对比:python语法仅支持整数、浮点数和复数3种类型

1.科学计算设计数据较多,对存储和性能都有较高要求

2.对元素类型精细定义,有助于numpy合理使用储存空间并优化性能

3.对元素类型精细定义,有助于程序员对程序规模有合理评估

ndarray数组可以由非同质对象构成 np.array([0,1,2,3,4],[9,8,7,6])

非同质ndarray元素为对象类型  dtype = object

非同质ndarray对象无法有效发挥numpy优势,尽量避免使用

创建数组(方法一)

创建数组的方法有多种,比如可以使用array函数利用常规的python列表和元组创造数组。所创建的数组类型由原序列中的元素类型决定。

x= np.array(list/tuple,dtype=np.float32)

示例如下:

创建数组(方法二)

numpy提供了一些使用占位符创建数组的函数

例如:

函数zeros(shape)创建一个全是0的数组,

函数ones(shape)创建一个全1的数组,

函数empty创建一个内容随机并且依赖与内存状态的数组

函数full(shape,val) 根据shape生成一个数组,每个元素值都是val

函数eye(n)创建一个正方的n*n的单位矩阵,对角线为1,其余都是0

默认创建的数组类型(dtype)都是float64.示例如下:

zeros((3,4))

ones((2,3,4),dtype = int16)

#2个维度,每个维对里有3个数组,每个数组里4个元素

empty((2,3))

np.eye(5)

创建数组(方法三)

此外numpy提供一个arange的函数返回数组,示例如下:

arange(10,30,5)

arange(0,2,0.3)

其他创建方法

np.ones_like(a)     根据数组a的形状生成一个全1数组

np.zeros_like(a)    根据数组a的形状生成一个全0数组

np.full_like(a,val)    根据数组a的形状生成一个数组,每个元素值都是val

np.linspace()    根据起止数据等间距地填充数据,形成数据

np.concatenate()  将两个或多个数组合成一个新的数组

打印数组

打印数组时,numpy以类似嵌套列表的形式显示

示例如下:其中一维数组被打印成行,二维数组成矩阵,三维数组成矩阵列表

ndarray数组的变换

对于创建后的ndarray数组,可以对其进行纬度变换和元素类型变换

a = np.ones((2,3,4),dtype = np.int32)

.reshape(shape)     不改变数组元素,返回一个shape形态的数组,原数组不变

.resize(shape)        与.reshape()功能一致,但修改原数组

.swapaxes(ax1,ax2)    将数组n个维度中两个维度进行调换

.flatten()                  对数组进行降维,返回折叠后的一堆数组,原数组不变

ndarray数组的维度变换

基本运算

数组的算术运算是按元素进行。

numpy中的乘法运算符*指示按元素计算

矩阵乘法可以使用dot函数或创建矩阵对象实现。

numpy一元函数

对ndarray中的数据执行元素级运算的函数

np.abs(x)  np.fabs(x)  计算数组各元素的绝对值

np.sqrt(x)   计算数组各元素的平方根

np.square(x)  计算数组各元素的平方

np.log(x)   np.log10(x)  np.log2(x)   计算数组各元素的自然对数、10底对数和2底对数

np.ceil(x)   np.floor(x)   计算数组各元素的ceiling值或floor值

np.rint(x)   计算数组各元素的四舍五入值

np.modf(x)   将数组各元素的小数和整数部分以两个独立数组形式返回

np.cos(x)  np.cosh(x) np.sin(x)  np.sinh(x)  np.tan(x)  np.tanh(x)  计算数组各元素的普通型和双曲型三角函数

np.exp(x)   计算数组各元素的指数值

np.sign(x)   计算数组各元素的符号值,1(+),0,-1(-)

+ 1 * / **     两个数组各元素进行对应运算

np.maxinum(x,y)  np.fmax()  np.minimum(x,y)  np.fmin()  元素级的最大值/最小值计算

np.mod(x.y)    元素级的模运算

np.copysign(x,y)   将数组y中各元素值的符号赋值给数组x对应元素

>  =  <= == !=   计算比较,产生布尔型数组

示例如下:

a=array([20,30,40,50])

b=arange(4)

打印b  array=([0,1,2,3])

c =a-b

打印 c  array=([20,29,38,47])

b**2

打印得 array([0,1,4,9])

10*sin(a)

打印得 array([9.12945251,-9.88031624,7.4511316,-2.62374854])

a<35

打印得 array([True,True,False,False],dtype = bool)

非数组的运算可以利用ndarray类方法实现

通用函数(ufunc)--Nunpy提供常见的数学函数

如sin,cos和exp

在numpy里这些函数作用桉数组的元素运算,产生一个数组作为输出。示例如下:

a =random.random((2,3))

打印结果:array([[0.52732678,0.92066148,0.25701814],[0.66596685,0.24443251,0.39027655]])

a.sum()

打印结果:3.0056823003535524

a.min()

打印结果:0.224443250574359088

a.max()

打印结果:0.92066148305911222

b = arange(12).reshape(3,4)

打印结果:array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])

b.sum(axis=0)

打印结果:array([12,15,18,21])

b.min(axis = 1)

打印结果:array([0,4,8])

b.cumsum(axis = 1)

打印结果:array([[0,1,3,6],[4,9,15,22],[8,17,27,38]],dtype=int32)

索引、切片与迭代

索引:获取数组中特定位置元素的过程

切片:获取数组元素子集的过程

数组还可以被索引、切片和迭代,示例如下:

a =arange(10)**3

打印结果:array([0,1,8,27,64,125,216,343,512,729],dtype=int32)

a[2]

打印结果:8

a[2:5]

打印结果:array([8,27,64],dtype=int32)

a[:6:2] = -1000

打印结果:array([-1000,1,-1000,27,-1000,125,216,343,512,729],dtype=int32)

a[::-1]

打印结果:array([729.512,343,216,125,-1000,27,-1000,1,-1000],dtype = int32)

矩阵运算

Numpy对于多维数组的运算,缺省情况下并不适用矩阵运算,对数组进行矩阵运算,可调用相应的函数。

numpy库也提供了matrix类,使用matrix类创建的是矩阵对象,他们的加减乘除运算缺省采用矩阵方式计算,用法和matlab十分类似。

矩阵中更高级的一些运算可以在numpy的线性代数子库linalg中找到。例如inv函数计算逆矩阵,solve函数可以求解多元一次方程组。

数据的csv文件存取

csv(comma-separated value,逗号分隔值)

产生是一种常见的文件格式,用来存储批量数据

np.savetxt(frame,array,fmt='%.18e',delimiter=None)

frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件

array:存入文件的数组

fmt:写入文件的格式,例如:%d   %.2f  %.18e

delimiter:分割字符串,默认是任何格式

np.loadtxt(frame,dtype=np.float,delimiter=None,unpack=False)

frame:文件、字符串或产生器,可以是.gz或.bz2的压缩文件

dtype:数据类型,可选

delimiter:分割字符串,默认是任何空格

unpack:如果true,读入属性将分别写入不同变量

csv只能有效存储一维和二维数组

np.savetxt()  np.loadtxt()只能有效存取一维和二维数组

多维数组的存取

a.tofile(frame,sep='',format='%s')

frame:文件、字符串

sep:数据分割字符串,如果是空串,写入文件为二进制

format:写入数据的格式

np.fromfile(frame,dtype = float,count = -1,sep='')

frame:文件、字符串

dtype:读取的数据类型

count:读入元素个数,-1表示读入整个文件

sep:数据分割字符串,如果是空串,写入文件为二进制

需要注意

改方法需要读取时知道存入文件时数组的维度和元素类型

a.tofile()和np.fromfile()需要配合使用

可以通过元数据文件来存储额外信息

numpy的便捷文件存取

np.save(fname,array) 或 np.savez(fname,array)

fname:文件名,以.npy为扩展名,压缩扩展名为.npz

array:数组变量

np.load(fname)

fname:文件名,以.npy为扩展名,压缩扩展名为.npz

numpy的随机函数子库

numpy的rando子库   np.random.*

np.random.rand()      np.random.randn()     np.random.randint()

rand(d0,d1...,dn)     根据d0-dn创建随机数数组,浮点数,[0,1],均匀分布

randn(d0,d1...,dn)    根据d0-dn创建随机数数组,标准正态分布

randint(low[,high,shape])   根据shape创建随机整数或整数数组,范围是[low,high]

seed(s)       随机数种子,s是给定的种子值

给随机数对象一个种子值,用于产生随机序列。

对于同一个种子值的输入,之后产生的随机数序列也一样。

通常是把时间秒数等变化值作为种子值,达到每次运行产生的随机系列都不一样

seed() 省略参数,意味着使用当前系统时间生成随机数

shuffle(a)               根据数组a的第1轴进行随排列,改变数组x

permutation(a)        根据数组a的第一轴产生一个新的乱序数组,不改变数组x

choice(a[,size,replace,p])    从一维数组a中以概率抽取元素,形成size形状新数组replace表示是否可以重用元素,默认为false

uniform(low,high,size)  产生具有均匀分布的数组,low起始值,high结束值,size形状

normal(loc,scale,size)   产生具有正态分布的数组,loc均值,scale标准差,size形状

poisson(lam,size)             产生具有泊松分布的数组,lam随机事件发生率,size形状

numpy的统计函数

sum(a,axis=None)     根据给定轴axis计算数组a相关元素之和,axis整数或元组

mean(a,axis=None)    根据给定轴axis计算组a相关元素的期望,axis整数或元组

average(a,axis=None,weights=None)   根据给定轴axis计算数组a相关元素的加权平均值

std(a,axis=None)        根据给定轴axis计算数组a相关元素的标准差

var(a,axis=None)        根据给定轴axis计算数组a相关元素的方差

min(a)    max(a)     计算数组a中元素的最小值、最大值

argmin(a)    argmax(a)      计算数组a中元素最小值、最大值的降一维后下标

unravel_index(index,shape)      根据shape将一维下标index转换成多维下标

ptp(a)                计算数组a中元素最大值与最小值的差

median(a)           计算数组a中元素的中位数(中值)

numpy的梯度函数

np.gradient(f)       计算数组f中元素的梯度,当f为多维时,返回每个维度梯度

梯度:连续值之间的变化率,即斜率

xy坐标轴连续三个x坐标对应的y轴值:a,b,c,其中,b的梯度是:(c-a)/2

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值