Python---Numpy科学计算库的使用

来源:互联网 发布:mac磁盘工具可清除 编辑:程序博客网 时间:2024/05/22 04:46

一、简介

NumPy是一个开源的Python科学计算基础库,包含:
- 一个强大的N维数组对象 ndarray
- 广播功能函数
- 整合C/C++/Fortran代码的工具
- 线性代数、傅里叶变换、随机数生成等功能

NumPy的引用:

import numpy as np

二、N维数组对象:ndarray

ndarray是一个多维数组对象,由两部分构成:
- 实际的数据
- 描述这些数据的元数据(数据维度、数据类型等)

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

2.1 ndarray对象的属性

属性 说明 .ndim 维度的数量 .shape ndarray对象的尺度,对于矩阵,n行m列 .size ndarray对象元素的个数,相当于.shape中n*m的值 .dtype ndarray对象的元素类型 .itemsize ndarray对象中每个元素的大小,以字节为单位

例如:

>>> a=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])>>> a.ndim2>>> a.shape(3, 4)>>> a.size12>>> a.dtypedtype('int64')>>> a.itemsize8

2.2 ndarry的元素类型

数据类型 说明 bool 布尔类型,True或False intc 与C语言中的int类型一致,一般是int32或int64 intp 用于索引的整数,与C语言中ssize_t一致,int32或int64 int8 字节长度的整数,取值:[‐128, 127] int16 16位长度的整数,取值:[‐32768, 32767] int32 32位长度的整数,取值:[‐231, 231‐1] int64 64位长度的整数,取值:[‐263, 263‐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位浮点数

2.3 ndarray数组的创建方法

2.3.1 从Python中的列表、元组等类型创建ndarray数组

x = np.array(list/tuple)x = np.array(list/tuple, dtype=np.float32)//当np.array()不指定dtype时,NumPy将根据数据情况关联一个dtype类型

例如:

>>> a=np.array([0,1,2,3])>>> aarray([0, 1, 2, 3])>>> a=np.array([0,1,2,3],dtype=np.float32)>>> aarray([ 0.,  1.,  2.,  3.], dtype=float32)>>> print(a)[ 0.  1.  2.  3.]

2.3.2 使用NumPy中函数创建ndarray数组

函数 说明 np.arange(n) 类似range()函数,返回ndarray类型,元素从0到n‐1 np.ones(shape) 根据shape生成一个全1数组,shape是元组类型 np.zeros(shape) 根据shape生成一个全0数组,shape是元组类型 np.full(shape,val) 根据shape生成一个数组,每个元素值都是val np.eye(n) 创建一个正方的n*n单位矩阵,对角线为1,其余为0 np.ones_like(a) 根据数组a的形状生成一个全1数组 np.zeros_like(a) 根据数组a的形状生成一个全0数组 np.full_like(a,val) 根据数组a的形状生成一个数组,每个元素值都是val np.linspace() 根据起止数据等间距地填充数据,形成数组 np.concatenate() 将两个或多个数组合并成一个新的数组

例如:

>>> np.arange(9)array([0, 1, 2, 3, 4, 5, 6, 7, 8])>>> np.ones(9)array([ 1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.,  1.])>>> np.ones((9),dtype=np.int32)array([1, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)>>> np.zeros((2,3))array([[ 0.,  0.,  0.],       [ 0.,  0.,  0.]])>>> np.full(9,100)array([100, 100, 100, 100, 100, 100, 100, 100, 100])>>> np.eye(5)array([[ 1.,  0.,  0.,  0.,  0.],       [ 0.,  1.,  0.,  0.,  0.],       [ 0.,  0.,  1.,  0.,  0.],       [ 0.,  0.,  0.,  1.,  0.],       [ 0.,  0.,  0.,  0.,  1.]])>>> x=np.eye(5)>>> np.full_like(x,8.88)array([[ 8.88,  8.88,  8.88,  8.88,  8.88],       [ 8.88,  8.88,  8.88,  8.88,  8.88],       [ 8.88,  8.88,  8.88,  8.88,  8.88],       [ 8.88,  8.88,  8.88,  8.88,  8.88],       [ 8.88,  8.88,  8.88,  8.88,  8.88]])>>> a=np.linspace(1,9,4,dtype=np.int32)>>> print(a)[1 3 6 9]>>> b=np.linspace(1,9,4,endpoint=False,dtype=np.int32)>>> print(b)[1 3 5 7]>>> c=np.concatenate((a,b))>>> print(c)[1 3 6 9 1 3 5 7]

2.4 ndarray数组的变换

方法 说明 .reshape(shape) 不改变数组元素,返回一个shape形状的数组,原数组不变 .resize(shape) 与.reshape()功能一致,但会修改原数组 .astype(new_type) 创建新的数组 .swapaxes(ax1,ax2) 将数组n个维度中两个维度进行调换 .flatten() 对数组进行降维,返回折叠后的一维数组,原数组不变 .tolist() 数组向列表转换

例如:

>>> a=np.arange(24)>>> print(a)[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23]>>> a.reshape((4,6))array([[ 0,  1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17],       [18, 19, 20, 21, 22, 23]])>>> aarray([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,       17, 18, 19, 20, 21, 22, 23])>>> a.resize((4,6))>>> aarray([[ 0,  1,  2,  3,  4,  5],       [ 6,  7,  8,  9, 10, 11],       [12, 13, 14, 15, 16, 17],       [18, 19, 20, 21, 22, 23]])>>> a.swapaxes(0,1)array([[ 0,  6, 12, 18],       [ 1,  7, 13, 19],       [ 2,  8, 14, 20],       [ 3,  9, 15, 21],       [ 4, 10, 16, 22],       [ 5, 11, 17, 23]])>>> a.flatten()array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,       17, 18, 19, 20, 21, 22, 23])>>> a.astype(np.float)array([[  0.,   1.,   2.,   3.,   4.,   5.],       [  6.,   7.,   8.,   9.,  10.,  11.],       [ 12.,  13.,  14.,  15.,  16.,  17.],       [ 18.,  19.,  20.,  21.,  22.,  23.]])>>> a.tolist()[[0, 1, 2, 3, 4, 5], [6, 7, 8, 9, 10, 11], [12, 13, 14, 15, 16, 17], [18, 19, 20, 21, 22, 23]]

三、ndarray数组的操作

3.1 数组的索引和切片

3.1.1 索引

直接索引,每个维度一个索引值

>>> a=np.arange(9)>>> a[3]3>>> a[1:8:3]array([1, 4, 7])//a[起始编号:终止编号:步长]>>> a.resize((3,3))>>> aarray([[0, 1, 2],       [3, 4, 5],       [6, 7, 8]])>>> a[1,1]4

3.1.2 切片

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

>>> a=np.arange(24).reshape((2,3,4))>>> aarray([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])>>> a[:,0,-2]array([ 2, 14])>>> a[:,0:2,:]array([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7]],       [[12, 13, 14, 15],        [16, 17, 18, 19]]])>>> a[:,:,::3]array([[[ 0,  3],        [ 4,  7],        [ 8, 11]],       [[12, 15],        [16, 19],        [20, 23]]])

3.2 数组的运算

数组与标量之间的运算作用于数组的每一个元素

>>> a=np.arange(24).reshape((2,3,4))>>> aarray([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])>>> a+1array([[[ 1,  2,  3,  4],        [ 5,  6,  7,  8],        [ 9, 10, 11, 12]],       [[13, 14, 15, 16],        [17, 18, 19, 20],        [21, 22, 23, 24]]])>>> a=a*2>>> aarray([[[ 0,  2,  4,  6],        [ 8, 10, 12, 14],        [16, 18, 20, 22]],       [[24, 26, 28, 30],        [32, 34, 36, 38],        [40, 42, 44, 46]]])

3.2.1 NumPy一元函数

函数 说明 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(‐)

3.2.2 NumPy二元函数

函数 说明
    ‐ * / **
两个数组各元素进行对应运算 np.maximum(x,y) np.fmax() np.minimum(x,y) np.fmin() 元素级的最大值/最小值计算 np.mod(x,y) 元素级的模运算 np.copysign(x,y) 将数组y中各元素值的符号赋值给数组x对应元素
< >= <= == !=
算术比较,产生布尔型数组
>>> a=np.arange(24).reshape((2,3,4))>>> b=np.sqrt(a)>>> aarray([[[ 0,  1,  2,  3],        [ 4,  5,  6,  7],        [ 8,  9, 10, 11]],       [[12, 13, 14, 15],        [16, 17, 18, 19],        [20, 21, 22, 23]]])>>> barray([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])>>> np.minimum(a,b)array([[[ 0.        ,  1.        ,  1.41421356,  1.73205081],        [ 2.        ,  2.23606798,  2.44948974,  2.64575131],        [ 2.82842712,  3.        ,  3.16227766,  3.31662479]],       [[ 3.46410162,  3.60555128,  3.74165739,  3.87298335],        [ 4.        ,  4.12310563,  4.24264069,  4.35889894],        [ 4.47213595,  4.58257569,  4.69041576,  4.79583152]]])>>> a>barray([[[False, False,  True,  True],        [ True,  True,  True,  True],        [ True,  True,  True,  True]],       [[ True,  True,  True,  True],        [ True,  True,  True,  True],        [ True,  True,  True,  True]]], dtype=bool)

四、NumPy的函数

4.1 NumPy的随机函数

NumPy的random子库
np.random.*

函数 说明 rand(d0,d1,..,dn) 根据d0‐dn创建随机数数组,浮点数,[0,1),均匀分布 randn(d0,d1,..,dn) 根据d0‐dn创建随机数数组,标准正态分布 randint(low[,high,shape]) 根据shape创建随机整数或整数数组,范围是[low, high) seed(s) 随机数种子,s是给定的种子值 shuffle(a) 根据数组a的第1轴进行随排列,改变数组x permutation(a) 根据数组a的第1轴产生一个新的乱序数组,不改变数组x choice(a[,size,replace,p]) 从一维数组a中以概率p抽取元素,形成size形状新数组 replace表示是否可以重用元素,默认为False uniform(low,high,size) 产生具有均匀分布的数组,low起始值,high结束值,size形状 normal(loc,scale,size) 产生具有正态分布的数组,loc均值,scale标准差,size形状 poisson(lam,size) 产生具有泊松分布的数组,lam随机事件发生率,size形状
>>> np.random.rand(2,3)array([[ 0.71434594,  0.57272119,  0.47711135],       [ 0.80828704,  0.06779339,  0.36447176]])>>> np.random.randn(2,3)array([[ 0.31938179, -1.34453592, -1.35738183],       [-1.93856717,  1.15491882,  0.24352126]])>>> a=np.random.randint(90,100,(3,4))>>> aarray([[96, 97, 96, 90],       [97, 90, 99, 98],       [92, 97, 91, 98]])>>> np.random.shuffle(a)>>> aarray([[96, 97, 96, 90],       [97, 90, 99, 98],       [92, 97, 91, 98]])>>> np.random.shuffle(a)>>> aarray([[96, 97, 96, 90],       [92, 97, 91, 98],       [97, 90, 99, 98]])

4.2 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相关元素的方差
>>> a=np.arange(24).reshape(3,8)>>> aarray([[ 0,  1,  2,  3,  4,  5,  6,  7],       [ 8,  9, 10, 11, 12, 13, 14, 15],       [16, 17, 18, 19, 20, 21, 22, 23]])>>> np.min(a)0>>> np.argmax(a)23>>> np.ptp(a)23>>> np.median(a)11.5

4.3 NumPy的梯度函数

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

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

>>> a=np.random.randint(0,20,(5))>>> aarray([10,  2,  4, 15,  3])>>> np.gradient(a)array([ -8. ,  -3. ,   6.5,  -0.5, -12. ])//   -8=(2-10)/1//   -3=(4-10)/2

五、数据存取

5.1 CSV文件存取

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,读入属性将分别写入不同变量
>>> a=np.arange(100).reshape(5,20)>>> np.savetxt('a.scv',a,fmt='%d',delimiter=',')>>> b=np.loadtxt('a.scv',dtype=np.int,delimiter=',')>>> barray([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16,        17, 18, 19],       [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36,        37, 38, 39],       [40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56,        57, 58, 59],       [60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76,        77, 78, 79],       [80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96,        97, 98, 99]])

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

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

5.2 多维数据存取

a.tofile(frame, sep='', format='%s')
  • frame : 文件、字符串
  • sep : 数据分割字符串,如果是空串,写入文件为二进制
  • format : 写入数据的格式
np.fromfile(frame, dtype=float, count=‐1, sep='')
  • frame : 文件、字符串
  • dtype : 读取的数据类型
  • count : 读入元素个数,‐1表示读入整个文件
  • sep : 数据分割字符串,如果是空串,写入文件为二进制
>>> a=np.arange(100).reshape(5,4,5)>>> a.tofile("b.dat",sep=",",format="%d")>>> b=np.fromfile("b.dat",sep=",")>>> barray([  0.,   1.,   2.,   3.,   4.,   5.,   6.,   7.,   8.,   9.,  10.,        11.,  12.,  13.,  14.,  15.,  16.,  17.,  18.,  19.,  20.,  21.,        22.,  23.,  24.,  25.,  26.,  27.,  28.,  29.,  30.,  31.,  32.,        33.,  34.,  35.,  36.,  37.,  38.,  39.,  40.,  41.,  42.,  43.,        44.,  45.,  46.,  47.,  48.,  49.,  50.,  51.,  52.,  53.,  54.,        55.,  56.,  57.,  58.,  59.,  60.,  61.,  62.,  63.,  64.,  65.,        66.,  67.,  68.,  69.,  70.,  71.,  72.,  73.,  74.,  75.,  76.,        77.,  78.,  79.,  80.,  81.,  82.,  83.,  84.,  85.,  86.,  87.,        88.,  89.,  90.,  91.,  92.,  93.,  94.,  95.,  96.,  97.,  98.,        99.])

5.3 NumPy的便捷存取

np.save(fname, array)  np.savez(fname, array)
  • fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
  • array : 数组变量
np.load(fname)
  • fname : 文件名,以.npy为扩展名,压缩扩展名为.npz
>>> a=np.arange(10)>>> np.save("a.npy",a)>>> b=np.load("a.npy")>>> barray([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
原创粉丝点击