numpy运算,矩阵和numpy向量转矩阵的区别

NumPy的矩阵和线性代数
我的图书馆
NumPy的矩阵和线性代数
内容索引矩阵 --- mat函数线性代数 --- numpy.linalg中的逆矩阵函数inv函数、行列式det函数、求解线性方程组的solve函数、内积dot函数、特征分解eigvals函数、eig函数、奇异值分解svd函数、广义逆矩阵的pinv函数In [1]:import numpy as np1. 矩阵在NumP中,矩阵是ndarray的子类,可以由专用的字符串格式来创建。我们可以使用mat、matrix、以及bmat函数来创建矩阵。1.1 创建矩阵mat函数创建矩阵时,若输入已经为matrix或ndarray对象,则不会为它们创建副本。因此,调用mat函数和调用matrix(data, copy=False)等价。在创建矩阵的专用字符串中,矩阵的行与行之间用分号隔开,行内的元素之间用空格隔开。In [2]:A = np.mat("1 2 3; 4 5 6; 7 8 9")print"Creation from string:\n", ACreation from string:[[1 2 3]&[4 5 6]&[7 8 9]]In [3]:# 转置print"Transpose A :\n", A.T# 逆矩阵print"Inverse A :\n", A.ITranspose A :[[1 4 7]&[2 5 8]&[3 6 9]]Inverse A :[[ -4. & 9. &-4.]&[ &9. &-1. & 9.]&[ -4. & 9. &-4.]]In [4]:# 通过NumPy数组创建矩阵print"Creation from array: \n", np.mat(np.arange(9).reshape(3,3))Creation from array:&[[0 1 2]&[3 4 5]&[6 7 8]]1.2 从已有矩阵创建新矩阵我们可以利用一些已有的较小的矩阵来创建一个新的大矩阵。用bmat函数来实现。In [5]:A = np.eye(2)print"A:\n", AB = 2 * Aprint"B:\n", B# 使用字符串创建复合矩阵print"Compound matrix:\n", np.bmat("A B")print"Compound matrix:\n", np.bmat("A B; B A")A:[[ 1. &0.]&[ 0. &1.]]B:[[ 2. &0.]&[ 0. &2.]]Compound matrix:[[ 1. &0. &2. &0.]&[ 0. &1. &0. &2.]]Compound matrix:[[ 1. &0. &2. &0.]&[ 0. &1. &0. &2.]&[ 2. &0. &1. &0.]&[ 0. &2. &0. &1.]]2. 线性代数线性代数是数学的一个重要分支。numpy.linalg模块包含线性代数的函数。使用这个模块,我们可以计算逆矩阵、求特征值、解线性方程组以及求解行列式。2.1 计算逆矩阵使用inv函数计算逆矩阵。In [6]:A = np.mat("0 1 2; 1 0 3; 4 -3 8")print"A:\n", Ainverse = np.linalg.inv(A)print"inverse of A:\n", inverseprint"check inverse:\n", inverse * AA:[[ 0 &1 &2]&[ 1 &0 &3]&[ 4 -3 &8]]inverse of A:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]check inverse:[[ 1. &0. &0.]&[ 0. &1. &0.]&[ 0. &0. &1.]]2.2 行列式行列式是与方阵相关的一个标量值。对于一个n*n的实数矩阵,行列式描述的是一个线性变换对“有向体积”所造成的影响。行列式的值为正,表示保持了空间的定向(顺时针或逆时针),为负表示颠倒空间的定向。numpy.linalg模块中的det函数可以计算矩阵的行列式。In [7]:A = np.mat("3 4; 5 6")print"A:\n", Aprint"Determinant:\n", np.linalg.det(A)A:[[3 4]&[5 6]]Determinant:-2.02.3 求解线性方程组矩阵可以对向量进行线性变换,这对应于数学中的线性方程组。solve函数可以求解形如Ax = b的线性方程组,其中A是矩阵,b是一维或二维的数组,x是未知变量。In [8]:A = np.mat("1 -2 1; 0 2 -8; -4 5 9")print"A:\n", Ab = np.array([0,8,-9])print"b:\n", bA:[[ 1 -2 &1]&[ 0 &2 -8]&[-4 &5 &9]]b:[ 0 &8 -9]In [9]:x = np.linalg.solve(A, b)print"Solution:\n", x# checkprint"Check:\n",b == np.dot(A, x)print np.dot(A, x)Solution:[ 29. &16. & 3.]Check:[[ True &True &True]][[ 0. &8. -9.]]2.4 特征值和特征向量特征值(eigenvalue)即方程Ax = ax的根,是一个标量。其中,A是一个二维矩阵,x是一个一维向量。特征向量(eigenvector)是关于特征值的向量。在numpy.linalg模块中,eigvals函数可以计算矩阵的特征值,而eig函数可以返回一个包含特征值和对应特征向量的元组。In [10]:A = np.mat("3 -2; 1 0")print"A:\n", Aprint"Eigenvalues:\n", np.linalg.eigvals(A)eigenvalues, eigenvectors = np.linalg.eig(A)print"Eigenvalues:\n", eigenvaluesprint"Eigenvectors:\n", eigenvectorsA:[[ 3 -2]&[ 1 &0]]Eigenvalues:[ 2. &1.]Eigenvalues:[ 2. &1.]Eigenvectors:[[ 0..]&[ 0.4472136 & 0.]]In [11]:# check# 计算 Ax = ax的左右两部分的值for i in range(len(eigenvalues)):& & print"Left:\n", np.dot(A, eigenvectors[:,i])& & print"Right:\n", np.dot(eigenvalues[i], eigenvectors[:,i])& & printLeft:[[ 1.]&[ 0.]]Right:[[ 1.]&[ 0.]]Left:[[ 0.]&[ 0.]]Right:[[ 0.]&[ 0.]]2.5 奇异值分解SVD(Singular Value Decomposition,奇异值分解)是一种因子分解运算,将一个矩阵分解为3个矩阵的乘积。奇异值分解是特征值分解的一种推广。在numpy.linalg模块中的svd函数可以对矩阵进行奇异值分解。该函数返回3个矩阵——U、Sigma和V,其中U和V是正交矩阵,Sigma包含输入矩阵的奇异值。In [12]:from IPython.display import LatexLatex(r"$M=U \Sigma V^*$")Out[12]:M=UΣV?M=UΣV?*号表示共轭转置In [13]:A = np.mat("4 11 14;8 7 -2")print"A:\n", AU, Sigma, V = np.linalg.svd(A, full_matrices=False)print"U:\n", Uprint"Sigma:\n", Sigmaprint"V:\n", VA:[[ 4 11 14]&[ 8 &7 -2]]U:[[-0.9486833 &-0.]&[-0..9486833 ]]Sigma:[ 18. & 9.]V:[[-0...]&[ 0...]]In [14]:# Sigma矩阵是奇异值矩阵对角线上的值np.diag(Sigma)Out[14]:array([[ 18., & 0. & & & &],& & & &[ &0. & & & &, & 9.]])In [17]:# checkM = U*np.diag(Sigma)*Vprint"Product:\n", MProduct:[[ &4. &11. &14.]&[ &8. & 7. &-2.]]2.6 广义逆矩阵广义逆矩阵可以使用numpy.linalg模块中的pinv函数进行求解。inv函数只接受方阵作为输入矩阵,而pinv函数没有这个限制。In [18]:A = np.mat("4 11 14; 8 7 -2")print"A:\n", AA:[[ 4 11 14]&[ 8 &7 -2]]In [19]:pseudoinv = np.linalg.pinv(A)print"Pseudo inverse:\n", pseudoinvPseudo inverse:[[-0..]&[ 0..]&[ 0..]]In [20]:# checkprint"Check pseudo inverse:\n", A*pseudoinvCheck pseudo inverse:[[ &1. & 0.]&[ &8. & 1.]]得到的结果并非严格意义上的单位矩阵,但是非常近似。In [21]:A = np.mat("0 1 2; 1 0 3; 4 -3 8")print"A:\n", Ainverse = np.linalg.inv(A)print"inverse of A:\n", inverseprint"check inverse:\n", inverse * Apseudoinv = np.linalg.pinv(A)print"Pseudo inverse:\n", pseudoinvprint"Check pseudo inverse:\n", A*pseudoinvA:[[ 0 &1 &2]&[ 1 &0 &3]&[ 4 -3 &8]]inverse of A:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]check inverse:[[ 1. &0. &0.]&[ 0. &1. &0.]&[ 0. &0. &1.]]Pseudo inverse:[[-4.5 &7. &-1.5]&[-2. & 4. &-1. ]&[ 1.5 -2. & 0.5]]Check pseudo inverse:[[ &1. &-2. & 8.]&[ &8. & 1. & 2.]&[ &0. & 3. & 1.]]
TA的最新馆藏
喜欢该文的人也喜欢随笔 - 420&
文章 - 20&评论 - 23&trackbacks - 0
matlab是标准的,numpy相当于转置后计算
&& x = [2,0,-1.4;2.2,0.2,-1.5;2.4,0.1,-1;1.9,0,-1.2]
2.0000 & &0 & & & & & &-1.4000
2.2000 & &0.2000 & &-1.5000
2.4000 & &0.1000 & &-1.0000
1.9000 & &0 & & & & & &-1.2000
0.0492 & & & &0.0142 & & &0.0192
0.0142 & & & &0.0092 & & &-0.0058
0.0192 & & & &-0.0058 & & 0.0492
2.0000 & & 2.2000 & & & & 2.4000 & & & 1.9000
0 & & & & & & 0.2000 & & & & 0.1000 & & & 0
-1.4000 & &-1.5000 & & & &-1.0000 & & -1.2000
&& cov(xt)
2.9200 & 3.1600 & 2.9500 & 2.6700
3.1600 & 3.4300 & 3.1750 & 2.8850
2.9500 & 3.1750 & 3.0100 & 2.7050
2.6700 & 2.8850 & 2.7050 & &2.4433
np.array(x).Tarray([[ 2. ,
1.9],& & & & &[ 0. ,
0. ],& & & & &[-1.4, -1.5, -1. , -1.2]])
&&& print(np.cov(np.array(x).T))[[ 0...] [ 0...] [ 0...]]
np.array(x)array([[ 2. ,
0. , -1.4],& & & & & [ 2.2,
0.2, -1.5],& & & & & [ 2.4,
0.1, -1. ],& & & & & [ 1.9,
0. , -1.2]])
&&& print(np.cov(np.array(x)))[[ 2.92
阅读(...) 评论()numpy线性代数基础 - Python和MATLAB矩阵处理的不同
在介绍工具之前先对理论基础进行必要的回顾是很必要的。没有理论的基础,讲再多的应用都是空中楼阁。本文主要设涉及线性代数和矩阵论的基本内容。先回顾这部分理论基础,然后给出MATLAB,继而给出Python的处理。个人感觉,因为Python是面向对象的,操纵起来会更接近人的正常思维;而MATLAB大多是以函数实现的,是向对象施加的一个操作。比如,A是一个矩阵,它有一个属性attr。用Python更可能是A.attr,而用MATLAB更可能是attr(A)。
一、线形代数理论基础
&&&&线形代数(linear algebra)是数学的一个分支,研究矩阵理论、向量空间、线性变换和有限维线形方程组等内容。
&&&&比较重要的思想有:1.线性代数的核心内容是研究有限维线性空间的结构和线性空间的线性变换;2.向量的线性相关性是研究线性空间结构与线性变换理论的基础;3.矩阵是有限维线性空间的线性变换的表示形式;4.线性方程组的求解问题是n维空间到m维空间线性映射求核和全体原象的问题;5.行列式是研究这些问题的一个工具。
&&&&主要内容有:1.矩阵运算:加减乘除、转置、逆矩阵、行列式、矩阵的幂、伴随矩阵;2.矩阵分块、秩、迹;3.解方程;4.线性相关;5.向量空间;6.特征值和特征向量;7.对称、相似;8.二次标准型;9.线性空间和基变换;10.正交空间;11.矩阵对角化;13.矩阵分解;14.重要数字特征。
二、MATLAB的处理
1.建立矩阵
MATLAB中,矩阵是默认的数据类型。它把向量看做1×N或者N×1的矩阵。
%建立了一个行向量,不同元素之间使用空格或者逗号分开都是可以的。
A=[1,2,3]&&&或者&&A=[1 2 3]
%建立一个矩阵,使用分号隔开不同的行。
A=[1,2,3;4,5,6]
%那么,建立一个列向量就好办了。每行一个元素,分号分开即可。当然也可以使用行向量的转置(一个撇号表示转置)。
A=[1;2;3]&&&或者&&&A=[1,2,3]’
MATLAB内置了很多特殊的矩阵生成函数,建立特殊矩阵十分方便。
i)第一组用来生成特殊规则的矩阵。如全零、全一、随机、等步长等形式。
X=zeros(m,n)&&&
%生成一个m*n的全0矩阵。同理,ones(m,n)生成一个全1矩阵;eye(m,n)生成一个单位阵。它们的重要作用在于预先分配矩阵空间,所以,在预知矩阵规模但是不知道矩阵具体数据的情况下,先用这几个函数生成一个矩阵,对提高运算速度十分有用。
X=rand(m,n)&&
%生成一个平均分布的随机矩阵,数值区间[0,1]。同理,randn(m,n)生成一个服从正态分布的随机矩阵。注意,这些所谓的随机实际上都是伪随机。
v=linspace(a,b,n)&&&
%产生线性空间矢量。a和b分别是起点和终点,n是本区间内的点数,默认100个点。同理,logspace(a,b,n)产生对数空间矢量。不过它默认点数是50个。
v=1:0.1:10&&&
%产生一个线性的矢量。规格是---起点:步长值:终点
ii)第二组用来在原有矩阵基础上获得一个具有某些特征的矩阵。
X=diag(v,k)和v=diag(X,k)&
%前者用矢量v中的元素生成一个对角矩阵,k是对角移位因子,默认为0,即主对角。k&0,对角线右移。后者返回矩阵X的对角元素,存在矢量v中。k的意义相同。
X1=triu(X,k)和X1=tril(X,k)&&
&%分别产生矩阵X的上三角矩阵和下三角矩阵。
fliplr(X)/flipud(X)/rot90(X)&&&
%这都是对矩阵的翻转操作,获得新的矩阵。分别是左右翻转(left-right)、上下翻转(up-down)和逆时针旋转90°操作。
iii)第三组用来生成一些具有理论价值的,往往是以数学家命名的矩阵。
magic(n)生成行列相加均为同一个数字的方阵。pascal(n)生成帕斯卡尔矩阵。hilb(n)生成希尔伯特矩阵。vander(v)生成范德蒙德矩阵。等等。
这些矩阵一般都有相应的学术背景,用到的时候,可以用命令help elmat在最后一个栏目中看看有没有自己要找的特殊矩阵,如果有,点进去进一步研究即可。
2.矩阵的特征信息
size(X)&&%获得矩阵X的行、列数。比如,X是一个3*5的矩阵,p=size(X)返回p=[3 5]
length()&&&%对于矢量,返回的是矢量的长度;对数组,返回的是数组最长的那一个维度的长度。
ndims()&&&%相当于length(size(x))。
numel()&&&%数组中元素的个数。
isempty()和isequal()等is*型函数&&&&%测试矩阵是否满足某些条件
[V,D] = eig(A)&&%矩阵A的特征值D和特征向量V。
k = rank(A)&&&%矩阵A的秩
b = trace(A)&&%矩阵A的迹,即对角线元素之和
d = det(X)&&&&%方阵A的行列式
Y = inv(X)&&&%矩阵X的逆矩阵
n = norm(X,option)&&&%矩阵或者向量的范数,具体使用用到再说
c = cond(X)&&&&%矩阵X的条件数
3.矩阵分解
矩阵分解是矩阵论的重要内容。常用的分解形式在MATLAB中都有函数予以实现,并且有些分解考虑了多种情况。常见的如:eig()、qr()、schur()、svd()、chol()、lu()等。具体使用的时候
4.矩阵运算
MATLAB默认的是矩阵运算,所以如果想要按元素依次计算,在原来运算符前加一个.号。比如.*表示按元素相乘。
每一个运算符都有一个对应的函数。如:
A+B=plus(A,B)、A-B=minus(A,B)
A*B=mtimes(A,B)、A.*B=times(A,B)
A/B=mrdivide(A,B)、A./B=rdivide(A,B)、A\B=mldivide(A,B)、A.\B=ldivide(A,B)
A^B=mpower(A,B)、A.^B=power(A,B)
A'=ctranspose(A)、A.'=transpose(A)
其中的前缀m自然是表示matrix的意思。没有m前缀的就是按元素进行的意思。最后那个转置操作,c前缀表示的是按照复数操作进行转置。
此外,还有一些比较常用的运算:
C=cross(A,B)&&
%矢量叉乘。类似的,C=dot(A,B)&&是矢量点乘
B = prod(A,dim)&&&
%数组元素的乘积,默认按列计算。dim=1是列,dim=2是按行。这个概念很重要!!
类似的,B = sum(A,dim)&&&求数组元素的和。dim意义和以上同。
%矩阵指数运算。与此类似的logm(), sqrtm()。其中,funm(A,fun)用来计算矩阵A对通用函数fun的函数值。
5.矩阵索引
选择使用矩阵中的某些元素,就是所谓的矩阵索引了。
A(:,j)&&&%选取矩阵A的所有行,第j列,同理,A(i,:)是第i行,所有列
A(:,j:k)&&&&%所有行,第j列至第k列(起点和终点均含)
三、Python的处理
Python使用NumPy包完成了对N-维数组的快速便捷操作。使用这个包,需要导入numpy。SciPy包以NumPy包为基础,大大的扩展了numpy的能力。为了使用的方便,scipy包在最外层名字空间中包括了所有的numpy内容,因此只要导入了scipy,不必在单独导入numpy了!但是为了明确哪些是numpy中实现的,哪些是scipy中实现的,本文还是进行了区分。以下默认已经:import
numpy as np 以及 impor scipy as sp
下面简要介绍Python和MATLAB处理数学问题的几个不同点。1.MATLAB的基本是矩阵,而numpy的基本类型是多为数组,把matrix看做是array的子类。2.MATLAB的索引从1开始,而numpy从0开始。
1.建立矩阵
a1=np.array([1,2,3],dtype=int)&&&#建立一个一维数组,数据类型是int。也可以不指定数据类型,使用默认。几乎所有的数组建立函数都可以指定数据类型,即dtype的取值。
a2=np.array([[1,2,3],[2,3,4]])&&&#建立一个二维数组。此处和MATLAB的二维数组(矩阵)的建立有很大差别。
同样,numpy中也有很多内置的特殊矩阵:
b1=np.zeros((2,3))&&&&#生成一个2行3列的全0矩阵。注意,参数是一个tuple:(2,3),所以有两个括号。完整的形式为:zeros(shape,dtype=)。相同的结构,有ones()建立全1矩阵。empty()建立一个空矩阵,使用内存中的随机值来填充这个矩阵。
b2=identity(n)&&&#建立n*n的单位阵,这只能是一个方阵。
b3=eye(N,M=None,k=0)&&&&#建立一个对角线是1其余值为0的矩阵,用k指定对角线的位置。M默认None。
此外,numpy中还提供了几个like函数,即按照某一个已知的数组的规模(几行几列)建立同样规模的特殊数组。这样的函数有zeros_like()、empty_like()、ones_like(),它们的参数均为如此形式:zeros_like(a,dtype=),其中,a是一个已知的数组。
c1=np.arange(2,3,0.1)&&&#起点,终点,步长值。含起点值,不含终点值。
c2=np.linspace(1,4,10)&&&&#起点,终点,区间内点数。起点终点均包括在内。同理,有logspace()函数
d1=panion(a)&&&&#伴随矩阵
d2=np.linalg.triu()/tril()&&&#作用同MATLAB中的同名函数
e1=np.random.rand(3,2)&&&&#产生一个3行2列的随机数组。同一空间下,有randn()/randint()等多个随机函数
fliplr()/flipud()/rot90()&&&&#功能类似MATLAB同名函数。
xx=np.roll(x,2)&&&#roll()是循环移位函数。此调用表示向右循环移动2位。
2.数组的特征信息
先假设已经存在一个N维数组X了,那么可以得到X的一些属性,这些属性可以在输入X和一个.之后,按tab键查看提示。这里明显看到了Python面向对象的特征。
X.flags&&&&#数组的存储情况信息。
X.shape&&&&#结果是一个tuple,返回本数组的行数、列数、……
X.ndim&&&#数组的维数,结果是一个数
X.size&&&&#数组中元素的数量
X.itemsize&&&&#数组中的数据项的所占内存空间大小
X.dtype&&&&#数据类型
X.T&&&#如果X是矩阵,发挥的是X的转置矩阵
X.trace()&&&&#计算X的迹
np.linalg.det(a)&&&#返回的是矩阵a的行列式
np.linalg.norm(a,ord=None)&&&&#计算矩阵a的范数
np.linalg.eig(a)&&&&#矩阵a的特征值和特征向量
np.linalg.cond(a,p=None)&&&&#矩阵a的条件数
np.linalg.inv(a)&&&&#矩阵a的逆矩阵
3.矩阵分解
常见的矩阵分解函数,numpy.linalg均已经提供。比如cholesky()/qr()/svd()/lu()/schur()等。某些算法为了方便计算或者针对不同的特殊情况,还给出了多种调用形式,以便得到最佳结果。
4.矩阵运算
np.dot(a,b)用来计算数组的点积;vdot(a,b)专门计算矢量的点积,和dot()的区别在于对complex数据类型的处理不一样;innner(a,b)用来计算内积;outer(a,b)计算外积。
专门处理矩阵的数学函数在numpy的子包linalg中定义。比如np.linalg.logm(A)计算矩阵A的对数。可见,这个处理和MATLAB是类似的,使用一个m后缀表示是矩阵的运算。在这个空间内可以使用的有cosm()/sinm()/signm()/sqrtm()等。其中常规exp()对应有三种矩阵形式:expm()使用Pade近似算法、expm2()使用特征值分析算法、expm3()使用泰勒级数算法。在numpy中,也有一个计算矩阵的函数:funm(A,func)。
numpy中的数组索引形式和Python是一致的。如:
x=np.arange(10)
print x[2]&&&&#单个元素,从前往后正向索引。注意下标是从0开始的。
print x[-2]&&&&#从后往前索引。最后一个元素的下标是-1
print x[2:5]&&&&#多个元素,左闭右开,默认步长值是1
print x[:-7]&&&&#多个元素,从后向前,制定了结束的位置,使用默认步长值
print x[1:7:2]&&&#指定步长值
x.shape=(2,5)&&&&#x的shape属性被重新赋值,要求就是元素个数不变。2*5=10
print x[1,3]&&&&#二维数组索引单个元素,第2行第4列的那个元素
print x[0]&&&#第一行所有的元素
y=np.arange(35).reshape(5,7)&&&&#reshape()函数用于改变数组的维度
print y[1:5:2,::2]&&&&#选择二维数组中的某些符合条件的元素
-------------------------------------------------分割线-------------------------------------------------
我们可以看到,MATLAB中实现了的函数或者功能,在numpy中都有了对应,并且有些实现的更好。当然,这只是冰山一角。如果你不愿意通读文档,也应该有理由相信,Python有能胜任工作的实现已经存在。后面的内容,将不再这样列出各种函数和功能,而是以某一个实际问题为核心,进行专题式的研究。至于全方位的了解,请自己查阅文档。有个经验之谈,就是,应该充分的利用文档中的【see
also】功能,依此追踪下去,必然会获得关于某主题的全方位的认识。比如,在查阅ones()的时候,MATLAB的【see also】就给出了complex|eye|true|zeros四个链接。这就说明,这几个函数其实是有关联的,点进去进行简单的学习,找到共性。我们不需要记住所有的函数,我们只需要记住有那么回事,只需要记住一个类似的函数,就可以很轻易的在用的时候顺藤摸瓜找出需要的函数。
help 函数名&&
%在控制台给出某函数或者主题的帮助信息
doc&&函数名&
%在帮助浏览器中给出帮助信息,这个界面更友好。在help browser中既有MATLAB整个产品的浏览左窗口,也有一个搜索框。同时还有大量存在的超链接。就一个感兴趣的主题,点下去,全面学习。不过要记住:别分神哦~~点到最后都忘了自己究竟要做什么!
lookfor 关键词&&&
%这是一个模糊寻找,含有关键词的词条入口都会给出来
help(np.array)&&&&#查看关于array的帮助信息
help(np.add)&&#查看关于add的帮助信息
关于python科学计算,隆重推荐sage math,sage的特点和用法
看过本文的人也看了:
我要留言技术领域:
取消收藏确定要取消收藏吗?
删除图谱提示你保存在该图谱下的知识内容也会被删除,建议你先将内容移到其他图谱中。你确定要删除知识图谱及其内容吗?
删除节点提示无法删除该知识节点,因该节点下仍保存有相关知识内容!
删除节点提示你确定要删除该知识节点吗?numpy中的matrix和array
时间: 01:02:12
&&&& 阅读:33405
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&Preface
在相关聚类算法的实现过程中,用python语言实现,会经常出现array和matrix的混淆,这里做个总结。
numpy中最基本(默认)的类型是array,他的相关操作都是按元素操作的即用作数值计算当中(按元素操作有+,-,,/,*等)。相乘举例:
from numpy
&&& a=array([1,2])
array([1, 2])
&&& b=array([2,3])
array([2, 3])
array([2, 6])
&&& dot(a,b)
两个array的相乘*指的是对应元素的相乘;两个array的dot表示矩阵的相乘。
若a是array,则a.T表示转置。
把array转换为matrix用asmatrix()
多数numpy函数返回的是array类型,不是matrix类型。
matrix矩阵
在numpy中的特殊类型,是作为array的子类出现,所以继承了array的所有特性并且有自己的特殊的地方,专门用来处理线性代数操作(*表示矩阵的相乘,但是对于两个matrix的除/则表示对应元素的相除。)。乘法举例如:
&&& m=mat([2,3])
matrix([[2, 3]])
&&& n=([1,2])
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
File "C:\Python27\lib\site-packages\numpy\matrixlib\defmatrix.py", line 341, i
return N.dot(self, asmatrix(other))
ValueError: objects are not aligned
&&& dot(m,n)
matrix([[8]])
&&& multiply(m,n)
matrix([[2,6]])
两个matrix相乘*错误原因是m的列不等于n的行,也即不对齐(aligned),若对齐了,则是对应元素的相乘,返回一个matrix;两个matrix的*表示是两个矩阵的相乘。两个matrix的dot表示矩阵相乘。两个matrix的multiply表示对应元素的相乘。**
- matrix中.H,.A,.I表示共轭,转置,逆矩阵。
- 把matrix转换为array用asarray()
- asanyarray()根据和你的输入的类型保持一致。
这里会涉及到rank的概念,在线性代数(math)rank表示秩,但是必须明确的是在numpy里rank不是表示秩的概念,是表示维数的概念,这个理解的话需要看此文章:对于多维arrays的数据结构解释:
[多维arrays数据结构理解][1]
这里暂时理解为秩,虽然这样理解是错误的,但是可以说的通一些事情。(在实际的array和matrix里,英文里介绍的关于rank就用线性代数的秩来理解,但是英文会出现dimensions等于多少等,要求matrix的dimesions必须为2,这里其实指的就是秩,dimensions才是在numpy里的真实的理解形式)
array要求秩为1(N*1,1*N等)或者大于2
matrix要求秩必须为2(rank必须为2)
- 下面是关于ndim和size的理解:
array([1, 2])
array([[1, 2],
matrix([[1, 2, 3, 4],
[2, 3, 4, 5]])
array([[1, 2, 3, 4],
[2, 3, 4, 5]])
matrix([[1, 2, 3, 4],
[2, 3, 4, 5],
[3, 4, 5, 6]])
&&& a.size
&&& a.ndim
&&& b.size
&&& b.ndim
&&& c.size
&&& c.ndim
&&& d.size
&&& d.ndim
&&& e.ndim
**这里ndim就是求的是rank,所以会发现matrix的都是2,但是array的就会存在差异,需要计算等。size返回的是元素的个数**
- 关于dim, shape, rank, dimension and axis in numpy的细节的问题理解:
[stackoverflow地址][2]
M = matrix([, , , [4]])
如何转变为
array([1, 2, 3, 4])
比较优雅的办法:
x=matrix(arange(12).reshape((3,4)))
matrix([[ 0,
9, 10, 11]])
array([ 0,
9, 10, 11])
在运用中,还是用array好点,array的唯一缺陷就是在表示矩阵的相乘时候,要用dot,而不是*。
关于numpy里的array和matrix的其余的操作函数,另见wiki地址:
标签:&&&&&&&&&&&&&&&
&&国之画&&&& &&&&chrome插件
版权所有 京ICP备号-2
迷上了代码!}

我要回帖

更多关于 numpy向量转矩阵 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信