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

一、简介

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

NumPy的引用:

import numpy as np

二、N维数组对象:ndarray

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

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

2.1 ndarray对象的属性

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

例如:

>>> a=np.array([[0,1,2,3],[4,5,6,7],[8,9,10,11]])
>>> a.ndim
2
>>> a.shape
(3, 4)
>>> a.size
12
>>> a.dtype
dtype('int64')
>>> a.itemsize
8

2.2 ndarry的元素类型

数据类型说明
bool布尔类型,True或False
intc与C语言中的int类型一致,一般是int32或int64
intp用于索引的整数,与C语言中ssize_t一致,int32或int64 int8 字节长度的整数,取值:[‐128, 127]
int1616位长度的整数,取值:[‐32768, 32767]
int3232位长度的整数,取值:[‐231, 231‐1]
int6464位长度的整数,取值:[‐263, 263‐1]
uint88位无符号整数,取值:[0, 255]
uint1616位无符号整数,取值:[0, 65535]
uint3232位无符号整数,取值:[0, 2^32‐1]
uint6464位无符号整数,取值:[0, 2^64‐1]
float1616位半精度浮点数:1位符号位,5位指数,10位尾数
float3232位半精度浮点数:1位符号位,8位指数,23位尾数
float6464位半精度浮点数: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])
>>> a
array([0, 1, 2, 3])
>>> a=np.array([0,1,2,3],dtype=np.float32)
>>> a
array([ 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]])
>>> a
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.resize((4,6))
>>> a
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.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))
>>> a
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
>>> a[1,1]
4

3.1.2 切片

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

>>> a=np.arange(24).reshape((2,3,4))
>>> a
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[:,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))
>>> a
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+1
array([[[ 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
>>> a
array([[[ 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)
>>> a
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]]])
>>> 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]]])
>>> 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>b
array([[[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))
>>> a
array([[96, 97, 96, 90],
       [97, 90, 99, 98],
       [92, 97, 91, 98]])
>>> np.random.shuffle(a)
>>> a
array([[96, 97, 96, 90],
       [97, 90, 99, 98],
       [92, 97, 91, 98]])
>>> np.random.shuffle(a)
>>> a
array([[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)
>>> a
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]])
>>> 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))
>>> a
array([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=',')
>>> b
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, 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=",")
>>> b
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.,  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")
>>> b
array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值