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, 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]")

其优缺点各自如下:

  • array

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

 

 

 

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

 

posted @ 2019-02-18 22:31  从头再来,不要慌  阅读(3017)  评论(0编辑  收藏  举报