Python numpy数值计算基础
数组创建
-
创建数组对象
np.array(object, dtype,ndmin)- object: array-like ,接收的数组对象
- dtype: 创建的数组的数据类型,默认为None
- ndmin: 生成数组应有的最小维数,默认为None
>>> li1=[1,2,3,4] >>> arr1=np.array(li1) >>> arr1 array([1, 2, 3, 4]) >>> li2=((1,2,3,4),(5,6,7,8)) >>> arr2=np.array(li2) >>> arr2 array([[1, 2, 3, 4], [5, 6, 7, 8]]) -
创建等差一维数组
np.arange([start,] stop ,[step],dtype)- start:起始值
- stop:结束值
- step:步长
- dtype:元素的数据类型,默认为输入数据的类型
>>> arr1=np.arange(10) >>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr2=np.arange(3,5) >>> arr2 array([3, 4]) >>> arr3=np.arange(0,1,0.2) >>> arr3 array([0. , 0.2, 0.4, 0.6, 0.8])也可以用linspace函数创建等差一维数组
np.linspace(start, stop, num, endpoint, retstep, dtype)- start:起始值
- stop:结束值
- num:产生的等差数组的元素个数
- endpoint:为True则数据范围[start,stop],否则[start,stop),默认为True
>>> arr1=np.linspace(1,5,5) >>> arr1 array([1., 2., 3., 4., 5.]) >>> arr2=np.linspace(1,5,5,endpoint=False) >>> arr2 array([1. , 1.8, 2.6, 3.4, 4.2]) -
创建一维等比数组
np.logspace(start, stop, num, endpoint=True, base=10.0, dtype=None)- start:起始值,代表base的幂数
- stop:结束值,代表base的幂数
- num:产生的等差数组的元素个数
- endpoint:为True则数据范围[start,stop],否则[start,stop),默认为True
- base:底数,默认为10
>>> arr1=np.logspace(0,1,5) # 10^0 ~ 10^1 --> (1,10) >>> arr1 array([ 1. , 1.77827941, 3.16227766, 5.62341325, 10. ]) >>> arr2=np.logspace(0,1,5,base=2.0) # 2^0 ~ 2^1 --> (1,2) >>> arr2 array([1. , 1.18920712, 1.41421356, 1.68179283, 2. ]) -
创建全0数组
np.zeros(shape, dtype=float, order='C')- shape:数组的维数
>>> arr1=np.zeros(3) >>> arr1 array([0., 0., 0.]) >>> arr2=np.zeros((3,2)) >>> arr2 array([[0., 0.], [0., 0.], [0., 0.]]) -
创建全1数组
np. ones(shape, dtype=None, order='C')- shape:数组的维数
>>> arr1=np.ones((2,3)) >>> arr1 array([[1., 1., 1.], [1., 1., 1.]]) -
创建对角矩阵
np.diag(v, k=0)- v: array-like 对角矩阵的对角值
>>> v = np.arange(4) >>> v array([0, 1, 2, 3]) >>> arr1=np.diag(v) >>> arr1 array([[0, 0, 0, 0], [0, 1, 0, 0], [0, 0, 2, 0], [0, 0, 0, 3]])
查看数组内容
- ndim:数组的轴的个数,即数组的维数
- size:数组的元素个数
- dtype:数组的元素类型
- shape:数组的形状
- itemsize:数组中每个元素的大小(所占字节数)
>>> arr1
array([[0, 0, 0, 0],
[0, 1, 0, 0],
[0, 0, 2, 0],
[0, 0, 0, 3]])
>>> arr1.ndim
2
>>> arr1.shape
(4, 4)
>>> arr1.size
16
>>> arr1.dtype
dtype('int32')
>>> arr1.itemsize
4
>>>
数组变换
- 改变数组的shape
np.reshape(a, newshape, order='C')- a:需要处理的数据
- newshape:改变后的数组的形状,可以设置一个维度的大小为-1,则系统会自动计算改变后的newshape
>>> arr1 array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) >>> arr1.reshape(2,-1) # 自动计算 10*1/2 = 5 ,newshape = (2,5) array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> np.reshape(arr1,(2,-1)) array([[0, 1, 2, 3, 4], [5, 6, 7, 8, 9]]) >>> arr1.reshape(5,2) array([[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]) - 数组扁平化
np.ravel(a)>>> arr1 = np.arange(12).reshape(3,-1) >>> arr1 array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> arr1.ravel() array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]) >>> - 数组合并
np.concatente(arr,axis)- arr:要合并的数组集合
- axis:合并的轴,axis=0进行纵向合并,axis=1进行横向合并
>>> arr1 array([[1, 2], [3, 4]]) >>> arr2 array([[2, 4], [6, 8]]) >>> np.concatenate((arr1,arr2),axis=0) #以x为轴,纵向合并 array([[1, 2], [3, 4], [2, 4], [6, 8]]) >>> np.concatenate((arr1,arr2),axis=1) #以y为轴,横向合并 array([[1, 2, 2, 4], [3, 4, 6, 8]]) - 数组转置
T>>> a = np.arange(6).reshape(2,3) >>> a array([[0, 1, 2], [3, 4, 5]]) >>> a.T array([[0, 3], [1, 4], [2, 5]]) >>> - 数组划分
np.split(ary, indices_or_sections, axis=0)- ary:被划分的数组
- indices_or_sections:int或1-D array,若为int则ary会被等划分为int份;若为1-D array则会在对应位置做切分 ,例如[2,3] --> [:2] + [2:3] + [3:]
- axis: axis=0 则以x为轴,横向切割;若axis=1则纵向切割
>>> a = np.arange(12).reshape(3,4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11]]) >>> p1,p2,p3=np.split(a,3,axis=0) # 横向等分为3份 >>> p1 array([[0, 1, 2, 3]]) >>> p2 array([[4, 5, 6, 7]]) >>> p3 array([[ 8, 9, 10, 11]]) >>> p1,p2,p3=np.split(a,[1,3],axis=1) # 纵向切割为[:1] [1:3] [3:] >>> p1 # [:1] array([[0], [4], [8]]) >>> p2 # [1:3] array([[ 1, 2], [ 5, 6], [ 9, 10]]) >>> p3 # [3:] array([[ 3], [ 7], [11]]) - 数组中插入操作
np.insert(arr, obj, values, axis=None)- arr:被插入的数组
- obj:int、slice或int序列 ,指定被插入的位置
- values:array_like,被插入的值
- axis:被插入的值,axis=0则横向插入, axis=1则纵向插入,若没有指定则会扁平化数组后插入
>>> a = np.arange(16).reshape(4,4) >>> a array([[ 0, 1, 2, 3], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [12, 13, 14, 15]]) >>> np.insert(a,1,axis=1,values=np.ones(4)) # 纵向插入 [1,1,1,1] array([[ 0, 1, 1, 2, 3], [ 4, 1, 5, 6, 7], [ 8, 1, 9, 10, 11], [12, 1, 13, 14, 15]]) >>> np.insert(a,1,axis=1,values=2) #纵向插入 int自动填满 array([[ 0, 2, 1, 2, 3], [ 4, 2, 5, 6, 7], [ 8, 2, 9, 10, 11], [12, 2, 13, 14, 15]]) >>> np.insert(a,2,values=100) #不指定插入的轴,扁平化数组 array([ 0, 1, 100, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15]) >>> np.insert(a,[1,3],axis=0,values=np.array(((-1,-1,-1,-1),(-2,-2,-2,-2)))) # 横向插入,插入1和3的位置,values为 2 array-like array([[ 0, 1, 2, 3], [-1, -1, -1, -1], [ 4, 5, 6, 7], [ 8, 9, 10, 11], [-2, -2, -2, -2], [12, 13, 14, 15]])
数组切片与索引
对于多维数组,每个维度上都有一个切片或索引,各个维度之间使用 , 隔开。切片的使用方式同列表一致。
>>> arr =np.arange(12).reshape(3,4)
>>> arr
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
>>> arr[:,1] # 取第1列
array([1, 5, 9])
>>> arr[0,1:3] # 取第0行,第1-2列元素
array([1, 2])
>>> arr[0:2,1:3] # 取第0-1行,第1-2列元素
array([[1, 2],
[5, 6]])
>>> arr[2,:] # 取第2行元素
array([ 8, 9, 10, 11])
通过数组的索引切片可以实现数组的差分,可以代替split函数
数组的运算
可以通过ufunc函数/通用函数直接对数值中的元素进行运算。包括四则运算、比较运算、逻辑运算。
>>> a = np.array([1,3,5])
>>> b = np.array([2,3,4])
>>> a<b # 比较运算
[ True False False]
>>> a!=b
[ True False True]
>>> a>b
[False False True]
>>> a==b
[False True False]
>>> a + b # 四则运算
array([3, 6, 9])
>>> a - b
array([-1, 0, 1])
>>> a * b
array([ 2, 9, 20])
>>> a ** b
array([ 1, 27, 625], dtype=int32)
>>> np.any(a<b) # np.any代表or操作,对输入的bool数组取or操作,返回bool值
True
>>> np.all(a<b) # np.all代表and操作,对输入的bool数组取and操作,返回bool值
False
>>>
可以利用 np.where(condition,x,y) 来实现条件逻辑运算,若满足条件则输出x,否则输出y;若没有指定x和y,则返回满足condition的坐标
>>> a= np.array([1,3,5,7,9,-1])
>>> np.where(a>4) # 没有指定x和y,返回坐标
(array([2, 3, 4], dtype=int64),)
# 指定x和y ,满足condition则返回x,否则返回y
>>> np.where([[True,False],[False,True]],[[1,2],[3,4]],[[11,12],[13,14]])
array([[ 1, 12],
[13, 4]])
>>>
常用统计函数
NumPy中提供了很多用于统计分析的函数,常见的有sum、mean、std、var、min和max等。
几乎所有的统计函数在针对二维数组的时候需要注意轴的概念。axis=0时表示沿着纵轴(x方向)进行计算,axis=1时沿横轴(y方向)进行计算。默认axis为None,此时会将数组扁平化再计算。常用统计函数包括mean() ,std() ,var() , max(),min()
>>> a = np.arange(16).reshape(4,4)
>>> a
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> a.mean() # 不指定axis,则计算所有元素的均值
7.5
>>> a.mean(axis=1) # 沿y轴计算mean
array([ 1.5, 5.5, 9.5, 13.5])
>>> a.std(axis=1)
array([1.11803399, 1.11803399, 1.11803399, 1.11803399])
>>> a.var(axis=1)
array([1.25, 1.25, 1.25, 1.25])
>>> a.max(axis=1)
array([ 3, 7, 11, 15])
>>> a.min(axis=1)
array([ 0, 4, 8, 12])
>>>

浙公网安备 33010602011771号