Python学习(八)Matlab和Numpy异同

参考资料:python

https://github.com/lijin-THU/notes-python(相应实体书为:《自学Python——编程基础、科学计算及数据分析》)git

从Matlab到Numpygithub

1. Numpy和Matlab比较编程

2. array仍是matrix?(数组 VS 矩阵)数组

Numpy 中不只提供了 array 这个基本类型,还提供了支持矩阵操做的类 matrix,可是通常推荐使用数组array:dom

  • 不少 numpy 函数返回的是 array,不是 matrix
  • 在 array 中,逐元素操做和矩阵操做有着明显的不一样
  • 向量能够不被视为矩阵

具体说来:函数

  • *, dot(), multiply()
    • array* -逐元素乘法,dot() -矩阵乘法
    • matrix* -矩阵乘法,multiply() -逐元素乘法
  • 处理向量
    • array:形状为 1xN, Nx1, N 的向量的意义是不一样的,相似于 A[:,1] 的操做返回的是一维数组shape为(N,)),形状为 N一维数组的转置还是本身自己
    • matrix:形状为 1xN, Nx1A[:,1] 返回的是二维 Nx1 矩阵
  • 高维数组
    • array支持大于2的维度
    • matrix:维度只能为2
  • 属性
    • array.T 表示转置
    • matrix.H 表示复共轭转置,.I 表示逆,.A 表示转化为 array 类型
  • 构造函数
    • arrayarray 函数接受一个(嵌套)序列做为参数——array([[1,2,3],[4,5,6]])
    • matrixmatrix 函数额外支持字符串参数——matrix("[1 2 3; 4 5 6]")

其优缺点各自以下:spa

  • array3d

    • [GOOD] 一维数组既能够当作列向量,也能够当作行向量v 在 dot(A,v) 被当作列向量,在 dot(v,A) 中被当作行向量,这样省去了转置的麻烦
    • [BAD!] 矩阵乘法须要使用 dot() 函数,如: dot(dot(A,B),C) vs A*B*C
    • [GOOD] 逐元素乘法很简单: A*B
    • [GOOD] 做为基本类型,是不少基于 numpy 的第三方库函数的返回类型
    • [GOOD] 全部的操做 *,/,+,**,... 都是逐元素的
    • [GOOD] 能够处理任意维度的数据
    • [GOOD] 张量运算
  • matrixcode

    • [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-base vs 0-base
  • () vs []
  • MATLABbeg(:step):end,包含结束值 end
  • Numpybeg:end(:step)不包含结束值 end

 

 

 

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

相关文章
相关标签/搜索