Python学习(八)Matlab和Numpy异同
参考资料:
https://github.com/lijin-THU/notes-python(相应实体书为:《自学Python——编程基础、科学计算及数据分析》)
从Matlab到Numpy
1. Numpy和Matlab比较

2. array还是matrix?(数组 VS 矩阵)
Numpy 中不仅提供了 array 这个基本类型,还提供了支持矩阵操作的类 matrix,但是一般推荐使用数组array:
- 很多
numpy函数返回的是array,不是matrix - 在
array中,逐元素操作和矩阵操作有着明显的不同 - 向量可以不被视为矩阵
具体说来:
*, dot(), multiply()array:*-逐元素乘法,dot()-矩阵乘法matrix:*-矩阵乘法,multiply()-逐元素乘法
- 处理向量
array:形状为1xN, Nx1, N的向量的意义是不同的,类似于A[:,1]的操作返回的是一维数组(shape为(N,)),形状为N,一维数组的转置仍是自己本身matrix:形状为1xN, Nx1,A[:,1]返回的是二维Nx1矩阵
- 高维数组
array:支持大于2的维度matrix:维度只能为2
- 属性
array:.T表示转置matrix:.H表示复共轭转置,.I表示逆,.A表示转化为array类型
- 构造函数
array:array函数接受一个(嵌套)序列作为参数——array([[1,2,3],[4,5,6]])matrix:matrix函数额外支持字符串参数——matrix("[1 2 3; 4 5 6]")
其优缺点各自如下:
-
array[GOOD]一维数组既可以看成列向量,也可以看成行向量。v在dot(A,v)被看成列向量,在dot(v,A)中被看成行向量,这样省去了转置的麻烦[BAD!]矩阵乘法需要使用dot()函数,如:dot(dot(A,B),C)vsA*B*C[GOOD]逐元素乘法很简单:A*B[GOOD]作为基本类型,是很多基于numpy的第三方库函数的返回类型[GOOD]所有的操作*,/,+,**,...都是逐元素的[GOOD]可以处理任意维度的数据[GOOD]张量运算
-
matrix[GOOD]类似与MATLAB的操作[BAD!]最高维度为2[BAD!]最低维度也为2[BAD!]很多函数返回的是array,即使传入的参数是matrix[GOOD]A*B是矩阵乘法[BAD!]逐元素乘法需要调用multiply函数[BAD!]/是逐元素操作
当然在实际使用中,二者的使用取决于具体情况。
二者可以互相转化:
asarray:返回数组asmatrix(或者mat) :返回矩阵asanyarray:返回数组或者数组的子类,注意到矩阵是数组的一个子类,所以输入是矩阵的时候返回的也是矩阵
3. 类Matlab函数:ones, zeros, empty, eye, rand, repmat
注:通常这些函数返回值为array;为了得到matrix返回值,可使用matlib子模块
1 import numpy 2 import numpy.matlib 3 4 a = numpy.ones(7) 5 print(a.shape) #(7,) 6 print(type(a)) #<class 'numpy.ndarray'> 7 8 a = numpy.matlib.ones(7) 9 print(a.shape) #(1,7) 10 print(type(a)) #<class 'numpy.matrixlib.defmatrix.matrix'>
- mat函数将数组转化为矩阵:a = numpy.array([1,2,3]);b = numpy.mat(a)
- 类似于利用matlib模块生成矩阵,还有部分函数也被放到子模块中了,如调用rand()函数需要使用numpy.random.rand() // a = numpy.random.rand(10)
4. 等效操作
1 from numpy import * 2 import scipy.linalg
#以下linalg代表numpy.linalg,与scipy.linalg不同
MATLAB 与 Numpy 下标之间有这样几处不同:
1-basevs0-base()vs[]MATLAB:beg(:step):end,包含结束值endNumpy:beg:end(:step),不包含结束值end






参考:http://wiki.scipy.org/NumPy_for_Matlab_Users#whichNotes

浙公网安备 33010602011771号