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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 162,710评论 4 376
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,839评论 2 308
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 112,295评论 0 255
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,776评论 0 223
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 53,198评论 3 297
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 41,074评论 1 226
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,200评论 2 322
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,986评论 0 214
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,733评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,877评论 2 254
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,348评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,675评论 3 265
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,393评论 3 246
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,209评论 0 9
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,996评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,212评论 2 287
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 36,003评论 2 280

推荐阅读更多精彩内容