当前位置: 首页 > 后端技术 > Python

NumPy:ndarray中的函数介绍

时间:2023-03-26 12:28:39 Python

在NumPy中,多维数组除了基本的算术运算外,还有一些非常好用的内置函数,可以加快我们的科学计算速度。简单函数先来看比较常用的计算函数。在使用它们之前,我们先构造一个数组:arr=np.arange(10)array([0,1,2,3,4,5,6,7,8,9])计算其中元素的平方根数组:np.sqrt(arr)array([0.,1.,1.4142,1.7321,2.,2.2361,2.4495,2.6458,2.8284,3.])自然常数e为底指数函数:np.exp(arr)array([1.,2.7183,7.3891,20.0855,54.5982,148.4132,403.4288,1096.6332,2980.958,8103.0839])取两个数组的最大值组成新数组:x=np.random).randn(8)y=np.random.randn(8)x,y(数组([-2.3594,-0.1995,-1.542,-0.9707,-1.307,0.2863,0.378,-0.7539]),数组([0.3313,1.3497,0.0699,0.2467、-0.0119、1.0048、1.3272、-0.9193]))np。maximum(x,y)array([0.3313,1.3497,0.0699,0.2467,-0.0104,20.7539])返回浮点数组的小数部分和整数部分:arr=np.random.randn(7)*5array([-7.7455,0.1109,3.7918,-3.3026,4.3129,-0.0502,0.25])余数,whole_part=np.modf(arr)(array([-0.7455,0.1109,0.7918,-0.3026,0.3129,-0.0205],),数组([-7.,0.,3.,-3.,4.,-0.,0.]))向量化数组操作如果要在数组之间进行操作,常用的方法是循环遍历,但是这样效率会比较低,所以Numpy提供了数组之间数据处理的方法。先解释一下np.meshgrid函数,这个函数用来快速生成网格点坐标矩阵。先看一个坐标点的代码:importnumpyasnpimportmatplotlib.pyplotaspltx=np.array([[0,1,2],[0,1,2]])y=np.array([[0,0,0],[1,1,1]])plt.plot(x,y,color='green',marker='.',linestyle='')plt.grid(True)plt.show()上面的X是一个二维数组,表示坐标点在X轴上的位置。Y也是一个二维数组,表示坐标点在Y轴上的位置。看画出来的图:上图是6个坐标点用X,Y矩阵组合起来的。上面的X和Y的二维数组是手动输入的。如果坐标上的点很多,手动输入肯定是不可取的。于是就有了函数np.meshgrid。该函数可以接受两个一维数组,然后生成一个二维的X、Y坐标矩阵。上面的例子可以改写为:x=np.array([0,1,2])y=np.array([0,1])xs,ys=np.meshgrid(x,y)xs,ys(array([[0,1,2],[0,1,2]]),array([[0,0,0],[1,1,1]]))可以看到生成的xs和ys以及手动输入是一样的。有了网格坐标,我们就可以根据网格值计算一些数据,比如:$sqrt(x^2+y^2)$,我们不需要变量矩阵中的所有数据,直接使用数组即可用于计算Just:np.sqrt(xs**2+ys**2)result:array([[0.,1.,2.],[1.,1.41421356,2.23606798]])因为xs并且ys本身是一个23矩阵,所以结果也是一个23矩阵。条件逻辑表达式我们可以在构建数组时使用条件逻辑表达式:xarr=np.2.5])cond=np.array([True,False,True,True,False])result=[(xifcelsey)forx,y,cinzip(xarr,yarr,cond)]result[1.1,2.2,1.3,1.4,2.5]更简单的,我们可以使用where语句:result=np.where(cond,xarr,yarr)resultarray([1.1,2.2,1.3,1.4,2.5])我们也可以使用where修改数组值的条件:arr=np.random.randn(4,4)arrarray([[0.7953,0.1181,-0.7485,0.585],[0.1527,-1.5657,-0.5625,-0.0327],[-0.929,-0.4826,-0.0363,1.0954],[0.9809,-0.5895,1.5817,-0.5287]])上面我们构造了一个4*4的数组。我们可以比较where中的数据,如果大于0,修改数据为2,如果小于0,修改数据为-2:np.where(arr>0,2,-2)array([[2,2,-2,2],[2,-2,-2,-2],[-2,-2,-2,2],[2,-2,2,-2]])Statisticsnumpy方法提供了mean和sum等统计方法:arr=np.random.randn(5,4)arrarr.mean()np.mean(arr)arr.sum()也可以按维度统计:arr。mean(axis=1)arr.sum(axis=0)cumsum用于累积计算:arr=np.array([0,1,2,3,4,5,6,7])arr.cumsum()array([0,1,3,6,10,15,21,28])用于乘法计算的cumprod:arr=np.array([[0,1,2],[3,4,5],[6,7,8]])arrrr.cumsum(axis=0)array([[0,1,2],[3,5,7],[9,12,15]])arrarr.cumprod(axis=1)array([[0,0,0],[3,12,60],[6,42,336]])布尔数组any用于检测数组中是否存在一个或多个True,而all则检测所有值在数组中是否全部为真:bools=np.array([False,False,True,False])bools.any()Truebools.all()FalseSort数组可以使用sort进行排序,除了正常排序还可以根据特定的轴进行排序:arr=np.random.randn(6)arr.sort()array([-2.5579,-1.2943,-0.2972,-0.1516,0.0765,0.1608])arr=np.random.randn(5,3)arrarr.sort(1)arrarray([[-0.8852sort(1)指的是按照第二轴对文件进行排序,可以方便的对文件进行数组写入和读取:arr=np.arange(10)np.save('some_array',arr)将保存的数组存储在some_array.npy文件,我们可以这样读它:np.load('some_array.npy')也可以以未压缩的方式存储多个数组:np.savez('array_archive.npz',a=arr,b=arr)读取:arch=np.load('array_archive.npz')arch['b']如果你想压缩,你可以这样做:np.savez_compressed('arrays_compressed.npz',a=arr,b=arr)线性代数如果我们用普通的算术运算符来进行矩阵运算,那只是对数组中相应元素的简单算术运算。如果我们想做矩阵之间的乘法,我们可以使用点。一个2×3的矩阵打点一个32的矩阵,最后得到一个2*2的矩阵。x=np。array([[1.,2.,3.],[4.,5.,6.]])y=np.array([[6.,23.],[-1,7],[8,9]])xyx.dot(y)array([[28.,64.],[67.,181.]])或者你可以这样写:np.dot(x,y)array([[28.,64.],[67.,181.]])你也可以使用@符号:x@yarray([[28.,64.],[67.,181.]])看看两者都有哪些运算:乘积运算:运算符描述dot(a,b[,out])矩阵点积linalg.multi_dot(arrays,*[,out])多矩阵点积vdot(a,b)向量点积inner(a,b)两个数组的内积outer(a,b[,out])两个向量的外积matmul(x1,x2,/[,out,casting,order,...])位的两个矩阵乘积的对应关系tensordot(a,b[,axes])计算沿指定轴的张量点积einsum(subscripts,*operands[,out,dtype,…])Einstein求和约定einsum_path(subscripts,*operands[,optimize])通过考虑中间数组的创建来评估einsum表达式的最小成本收缩阶数。linalg.matrix_power(a,n)矩阵的幂运算kron(a,b)矩阵的克罗内克积分解运算:算子描述Factorizationlinalg.svd(a[,full_matrices,compute_uv,…])奇异值分解特征值和特征向量:操作说明linalg.eig(a)计算方阵的特征值和右特征向量。linalg.eigh(a[,UPLO])返回复厄密矩阵(共轭对称)或实对称矩阵的特征值和特征向量。linalg.eigvals(a)计算一般矩阵的特征值。linalg.eigvalsh(a[,UPLO])计算复厄尔米特(共轭对称)或实对称矩阵的特征值。基准值:操作说明linalg.norm(x[,ord,axis,keepdims])matrixorvectornormlinalg.cond(x[,p])Computetheconditionnumberofamatrix.linalg.det(a)矩阵行和column公式linalg.matrix_rank(M[,tol,hermitian])使用SVD方法返回数组的矩阵秩。linalg.slogdet(a)计算数组行列式的符号和(自然)对数。trace(a[,offset,axis1,axis2,dtype,out])返回沿数组对角线的总和。求解和反转:操作说明linalg.solve(a,b)求解线性矩阵方程或线性标量方程组。linalg.tensorsolve(a,b[,axes])求解x的张量方程'ax=b'。linalg.lstsq(a,b[,rcond])返回线性矩阵方程的最小二乘解linalg.inv(a)计算矩阵的(乘法)逆矩阵。linalg.pinv(a[,rcond,hermitian])计算矩阵的(Moore-Penrose)伪逆。linalg.tensorinv(a[,ind])计算N维数组的“逆”。随机数很多时候我们需要生成随机数。NumPy中随机数的生成非常简单:samples=np.random.normal(size=(4,4))samplesarray([[-2.0016,-0.3718,1.669,-0.4386],[-0.5397,0.477,3.2489,-1.0212],[-0.5771,0.1241,0.3026,0.5238],[0.0009,1.3438,-0.7135,-0.8312]])使用normal得到标准正态分布的4×4样本数组。使用np.random比使用Python的内置随机数生成器快得多。np.random可以指定生成随机数的种子:np.random.seed(1234)numpy.random的数据生成函数使用全局随机种子。为了避免全局状态,你可以使用numpy.random.RandomState,创建一个与其他人隔离的随机数生成器:rng=np.random.RandomState(1234)rng.randn(10)本文已收集于http://www.flydean.com/10-python-numpy-func/最通俗的解读,最深刻的干货,最简洁的教程,很多你不知道的小技巧等你来发现!欢迎关注我的公众号:《程序那些事儿》,懂技术,更懂你!