zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    代码抄袭检测系统的设计和实现(1)--需求分析和基础架构
    Protobuf C/C++实战笔记(1)
    自动构建Makefile(1)--C/C++编译流程&Makefile规则简介
    初识storm
    Ubuntu 16.04LTS安装Nginx
    redis内存监控与回收
    RabbitMQ交换机规则实例
    git合并分支上指定的commit
    git忽略掉文件权限检查
    git修改文件权限方式
  • 原文地址:https://www.cnblogs.com/hg-love-dfc/p/10291708.html
Copyright © 2011-2022 走看看