诚然,没有一门语言能够撼动matlab的矩阵或科学计算在学术圈的地位,因其简洁的语法(matrix是其基本数据类型),因其矩阵运算的便捷,因其术业有专攻(matlab:为科学计算而生),因其名字matlab:matrix laboratory,所在的公司名mathworks:math works。我在写过一些matlab和python的代码之后,油然发过一句感慨“没有一门语言能比matlab还更具数学感”。然而,因为numpypandasmatplotlib 等一众优秀的开发者(不排除从matlab阵营溜出来的)贡献的一众优秀的开源的库,让python具备了和matlab一样的功能,为工程而生的python从此因为有了数学家的参与就相当初的matlab一样,也学术起来,工程学术通吃。

本文试图回答的问题包括:

  • 为什么矩阵运算要从matlab迁移到python?
  • 如何进行迁移,其中会涉及哪些基本编程理念的差异?
  • 迁移的过程中需要注意哪些细节?

python矩阵运算,更准确地说,是numpy矩阵运算,为了更为方便地使用numpy库,如下文使用的那样,我们需要导入numpy库并重命名为np

import numpy as np

零、编程理念的对比

0.1 编程范式

matlab是面向过程的编程方式,而python既支持面向过程又支持面向对象,是一种多范式(multi paradigms)的编程语言。因此,不难理解python编程语言中广泛存在的以下的两种等价实现方式:

np.dot(X, w)    # 调用全局函数,面向过程的编程方式
X.dot(w)        # 调用对象的成员函数,面向对象的编程方式

0.2 matlab从1开始计数,python从0开始

0.2.1 对矩阵而言:

r = size(A, 1);         % 表示的是行数
c = size(A, 2);         % 表示的是列数
i = 0:size(A, 1) - 1;
A(i, :)             % error: 矩阵的下标索引必须是正整数类型(>=1)或逻辑类型(true/false)

0.2.2 对python而言:

A.shape[0]      # 行数, axis = 0
A.shape[1]      # 列数,   axis = 1
# 等价的(或者叫面向过程的)表达方式
np.shape(A)[0]
np.shape(A)[1]
# 可从0开始索引矩阵的行
r = A.shape[0]
A[0:r, :]

0.3 matlab矩阵索引用的是小括号,python是中括号

小括号对于一种支持面向对象、支持运算符重载的语言来说,具有特别的意义,重载括号运算符是仿函数实现的命门。如果了解c++的运算符重载机制,一个类如果重载了括号运算符,便可称作仿函数,把一个类当做函数来使用。恰好,python也支持运算符重载。

class Prob(object):def __init__(self, lhs):self.lhs = lhsdef __call__(self, rhs):return self.lhs * rhs# def __call__(self, lhs, rhs)#   return lhs * rhs
if __name__ == '__main__':p = Prob(2)     # 调用的是类构造函数,也即__init__print(p(5))     # 调用的是实例的括号运算符,也即__call__

0.4 切片的端点值

matlab中的切片(也即:表达式),是包含两个端点值的,也即是一个闭区间

1:5     % 1, 2, 3, 4, 5

而python中的切片是一个左闭右开的区间:

A[0:2, :]   # 索引的是第零行和第一行,而不包括第二行

0.5 维度的顺序

% matlab
>> zeros(2, 3, 4)
ans(:,:,1) =0   0   00   0   0ans(:,:,2) =0   0   00   0   0ans(:,:,3) =0   0   00   0   0ans(:,:,4) =0   0   00   0   0
# python
>>> np.zeros((2, 3, 4))
array([[[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.]],[[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.],[ 0.,  0.,  0.,  0.]]])

所以如果一幅256×256256\times 256的彩色图像在matlab中的shape为256×256×3256\times256\times3,在python中的shape为3×256×2563\times256\times256。

一、 矩阵的基本操作

1.1 创建矩阵

1.1.1 matlab/octave

>> A = [1, 2, 3; 4, 5, 6; 7, 8, 9]
> A =1     2     34     5     67     8     9

分号表示一行的结束

1.1.2 python

A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
A = array([[1, 2, 3],[4, 5, 6], [7, 8, 9]])

以Python的基本数据类型list作为np.array的参数,生成numpy.ndarray,也即多维数组

1.2 获取矩阵的维度

1.2.1 matlab/octave

[r, c] = size(A)    % r = 3, c = 3
size(A, 1)          % 3
size(A, 2)          % 3
size(A, 3)          % 1
numel(A)            % 返回的是A的元素个数,即A的全部轴的乘积

1.2.2 python

shapes = A.shape    # 是tuple类型的返回值

而:

A.size          # 返回的是A的元素数,即行*列
A.size == np.prod(A.shape)

1.3 索引矩阵的行和列

1.3.1 matlab/octave

A(1, :)     % A的第一行
A(1:2, :)   % A的前两行
A(:, 1)     % A的第一列
A(:, 1:2)   % A的前两列
A(end, :)   % A的最后一行

1.3.2 python

A[0, :]     # 第一行
A[0:2, :]   # 第一行,第二行
A[:, 0]     # 第一列
A[:, 0:2]   # 第一列,第二列
A[-1, :]        # 最后一行

1.4 通过断言(predicate)提取矩阵的行和列

1.4.1 matlab/octave

mod(A, 4) == 00   0   01   0   00   1   0
A(mod(A, 4) == 0)   % 返回矩阵中是4的倍数的元素,

因取模算子%在矩阵中有着特殊的意义(注释),故取模运算用了一个函数来替代。

1.4.2 python

A%4 == 0array([[False, False, False],[ True, False, False],[False,  True, False]], dtype=bool)A[A%4==0]           % 返回矩阵中是4的倍数的元素

1.5 获取特定位置上的元素

以第一个元素为例:

1.5.1 matlab/octave

A(1, 1)

1.5.2 python

A[0, 0]

1.6 向量的操作

1.6.1 matlab

a = [1; 2; 3]   % 创建列向量
b = [1, 2, 3]   % 创建行向量, b = [1 2 3]
b = [1 2 3]'    % 行转换为列 

1.6.2 python

a = np.array([[1], [2], [3]])
b = np.array([1, 2, 3])
b = b[:, np.newaxis]    # 或者 b = b[np.newaxis].T

1.7 矩阵变维

将一个3*3矩阵转换为一个行向量

1.7.1 matlab/octave

B = reshape(A, 1, numel(A))

1.7.2 python

B = A.reshape(1, A.size)    # array([[1, 2, 3, 4, 5, 6, 7, 8, 9]])
B = A.ravel()               # array([1, 2, 3, 4, 5, 6, 7, 8, 9])        

1.8 矩阵拼接

1.8.1 matlab/octave

A(3, :) = []    % 移除矩阵的某一行(第三行),可见matlab中矩阵操作之强大
A = 1   2   34   5   6B = [7, 8, 9; 10, 11, 12]
C = [A; B]      % 列方向上的拼接1   2   34   5   67   8   910  11  12C = [A B]       % 行方向上的拼接1   2   3   7   8   94   5   6   10  11  12

1.8.2 python

A = A[0:2, :]       # 移除矩阵的第三行
B = np.array([[7, 8, 9], [10, 11, 12]])
C = np.concatenate((A, B), axis=0)  # 列方向的拼接
C = np.concatenate((A, B), axis=1)  # 行方向的拼接

机器学习的算法实践的过程中,如单层神经网络,支持向量机或者神经网络,常常会遇到对输入X<script type="math/tex" id="MathJax-Element-1">X</script>从d维增广到1+d维的情况(每个输入的第一维值为1):

N = 100, d = 5
X = np.random.randn(N, d)
x0 = np.ones((X.shape[0], 1))
X = np.concatenate((x0, X), axis=1)

1.9 向量(矩阵)层叠

1.9.1 matlab/octave

a = [1, 2, 3]
b = [4, 5, 6]
c = [a', b']
c = [a; b]

1.9.2 python

a = np.array([1, 2, 3])
b = np.array([4, 5, 6])
np.c_[a, b]                 # c_: columnarray([[1, 4],[2, 5],[3, 6]])np.r_[a, b]                 # r_: rowarray([1, 2, 3, 4, 5, 6])

二、 几种特殊矩阵

2.1 随机矩阵(均匀分布)

2.1.1 matlab/octave

rand(3, 2)

2.1.2 python

np.random.rand(3, 2)

无论是matlab中的rand()函数,还是numpy.random中的rand()函数,生成的随机数都是服从[0-1]的均匀分布(uniformed distributed),如何生成任意区间的随机数呢?例[2, 5]区间上的随机数 2*rand()+3

2.2 0矩阵, 全一矩阵,单位矩阵

符合大小的0矩阵,常常用以申请空间,初始化矩阵, 预先分配内存,提高执行的速度

2.2.1 matlab/octave

zeros(3, 2)
ones(3, 2)
eye(3)

2.2.2 python

np.zeros((3, 2))
np.ones((3, 2))
np.eye(3)

2.3 对角矩阵

2.3.1 matlab/octave

a = [1, 2, 3]
diag(a)
diag(diag(a)    % [1, 2, 3]

2.3.2 python

a = np.array([1, 2, 3])
np.diag(a)
np.diag(np.diag(a))     % array([1, 2, 3])

三、 矩阵运算

3.1 矩阵与标量运算

3.1.1 matlab/octave

A = [1, 2, 3; 4, 5, 6; 7, 8, 9]
A*2
A+2
A-2
A/2         % 最后统统转换为A中的每一个元素(element-wise)同标量的运算

3.1.2 python

A = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
A*2
A/2
A-2
A+2

3.2 矩阵与矩阵运算

无论是matlab中的乘法运算(*),还是numpy中的np.dot()运算,本质上执行的都是矩阵的乘法运算,都需要满足矩阵A的列数等于矩阵B的行数。

3.2.1 matlab/octave

A = [1, 2, 3; 4, 5, 6]  % 2*3
B = [1, 2; 3, 4; 5, 6]  % 3*2
A*B

3.2.2 python

A = np.array([[1, 2, 3], [4, 5, 6]])
B = np.array([[1, 2], [3, 4], [5, 6]])
A.dot(B)    # np.dot(A, B)

3.3 矩阵与向量运算

矩阵与向量的乘积,是矩阵与矩阵乘积的特例

3.4 按位矩阵与矩阵运算

3.4.1 matlab/octave

A.*A
A.+A
A.-A
A./A
A.^A

3.4.2 python

A*A
A+A
A-A
A/A

3.5 矩阵元素的幂乘

3.5.1 matlab/octave

A.^2

3.5.2 python

np.power(A, 2)

3.6 矩阵的幂乘

方阵才有幂乘运算

3.6.1 matlab/octave

A^2

3.6.2 python

np.linalg.matrix_power(A, 2)

3.7 矩阵转置

3.7.1 matlab/octave

A'

3.7.2 python

A.T

3.8 矩阵行列式

3.8.1 matlab/octave

det(A)

3.8.2 python

np.linalg.det(A)

3.9 矩阵求逆

3.9.1 matlab/octave

inv(A)

3.9.10 python

A_inv = np.linalg.inv(A)
assert(np.dot(A, A_inv).all() == (np.eye(2)).all()) 

3.10 计算矩阵协方差矩阵

协方差矩阵刻画的是属性间的关系,标准协方差矩阵的求法:

协方差(i,j)=(第i列所有元素-第i列均值)*(第j列所有元素-第j列均值)/(样本数-1)(分母减去1是为了实现无偏估计)

3.10.1 matlab/octave

>> x1 = [4.0000 4.2000 3.9000 4.3000 4.1000]’
>> x2 = [2.0000 2.1000 2.0000 2.1000 2.2000]'
>> x3 = [0.60000 0.59000 0.58000 0.62000 0.63000]’
>> cov( [x1,x2,x3] )
ans =2.5000e-02   7.5000e-03   1.7500e-037.5000e-03   7.0000e-03   1.3500e-031.7500e-03   1.3500e-03   4.3000e-04

3.10.1 python

>> x1 = np.array([ 4, 4.2, 3.9, 4.3, 4.1])
>> x2 = np.array([ 2, 2.1, 2, 2.1, 2.2])
>> x3 = np.array([ 0.6, 0.59, 0.58, 0.62, 0.63])
>> np.cov([x1, x2, x3])
array([[ 0.025  ,  0.0075 ,  0.00175],[ 0.0075 ,  0.007  ,  0.00135],[ 0.00175,  0.00135,  0.00043]])

3.11 计算特征值和特征向量

3.11.1 matlab/octave

[eig_vec, eig_val] = eig(A)

3.11.2 python

eig_val, eig_vec = np.linalg.eig(A)

3.12 生成高斯分布的数据集

3.12.1 matlab/octave

mu = [0, 0]
cov = [2, 0; 0, 2]
X = mvnrnd(mu, cov, 1000)

3.12.2 python

mu = np.array([0, 0])
cov = np.array([[2, 0], [0, 2]])
X = np.random.multivariate_normal(mu, cov, 100)

四、 numpy中的matrix与array对比

虽然numpy也存在matrix类型,且matrix语法更类似与matlab中的矩阵运算,而numpy中的数组,进行矩阵运算时,和matlab中的用法存在较大的差异,比如matlab中的*表示矩阵相乘,numpy中的数组却表示按位相乘。但绝大多数人仍然推荐numpy中的数组,因为numpy中的绝大多数函数的返回类型都是numpy.ndarray(),如果坚持使用numpy中的matrix类型的话,需要进行繁琐的类型转换(np.mat(A))。

关于矩阵运算从python到matlab的迁移,更详细的信息请见:http://wiki.scipy.org/NumPy_for_Matlab_Users

Python 机器学习——线性代数和矩阵运算:从matlab迁移到python相关推荐

  1. php调用python绘图程序_如何在matlab中调用python程序

    现在python很火,很多代码都是python写的,如果你和我一样,习惯了使用matlab,还想在matlab中调用Python的代码,应该怎么办呢?其中一条思路:首先在matlab中调用系统脚本命令 ...

  2. Python机器学习线性回归分析不同洲的人口和寿命

    这个项目中我运用到机器学习里的线性回归制作模型,对其训练并生成新的回归函数.我这一次是从github导入csv文件,内容是过去50年不同大洲国家的人口和寿命.这个项目中我用到了seaborn库和skl ...

  3. matlab代码用python替换_用python替换Matlab

    我是一名工程专业的学生,我必须做大量的数值处理,绘图,模拟等工作.我目前使用的工具是Matlab. 我在大学计算机上使用它来完成大部分任务. 但是,我想知道有哪些可用的免费选项. 我已经做过一些研究, ...

  4. Python机器学习引言与基础知识储备

    第一部分 机器学习入门 机器学习入门 第一部分 机器学习入门 1.1 为什么选择机器学习 1.1.1 机器学习能够解决的问题 1.1.2 熟悉任务和数据 1.2 为什么选择Python 1.3 sci ...

  5. 机器算法有哪几种 python_8种顶级Python机器学习算法-你必须学习

    今天,我们将更深入地学习和实现8个顶级Python机器学习算法. 让我们开始Python编程中的机器学习算法之旅. 8 Python机器学习算法 - 你必须学习 以下是Python机器学习的算法: 1 ...

  6. python机器学习及实践_Python机器学习及实践

    Python机器学习及实践/Chapter_1/.ipynb_checkpoints/Chapter_1.1-checkpoint.ipynb Python机器学习及实践/Chapter_1/.ipy ...

  7. matlab下调用python,numpy库函数的方法

    matlab下调用python,numpy库函数的方法 Matlab 调用 Python 下的脚本 这篇博文的目的是为了解决博主在用matlab的eig函数时遇到的一个问题: 博主在用matlab下的 ...

  8. Python 机器学习/深度学习/算法专栏 - 导读目录

    目录 一.简介 二.机器学习 三.深度学习 四.数据结构与算法 五.日常工具 一.简介 Python 机器学习.深度学习.算法主要是博主从研究生到工作期间接触的一些机器学习.深度学习以及一些算法的实现 ...

  9. python 算法教程 pdf 英文_上手实践《Python机器学习第2版》PDF中文+PDF英文+代码+Sebastian...

    学习机器学习,推荐学习<Python机器学习(第二版)>. <Python机器学习(第2版)>,图文并茂,代码详实,原理清晰,覆盖面适度,侧重算法实现和应用,作为入门级学习还是 ...

最新文章

  1. 转:初学者简易 .vimrc编写指南
  2. 在Lucene.net实现自定义排序
  3. WP7 App性能优化(8):检测应用程序性能(Ⅰ)
  4. python2.7删除所有非utf-8编码的字符串
  5. jquery --- 使用when方法等待2个异步事件结束后执行某一个函数.
  6. ubuntu 下安装配置LAMP
  7. 【呆萌の研究】JavaScript常见的继承方式
  8. 【ANSYS APDL】提取结构刚度矩阵完整过程--附Python代码实现
  9. linux uwf开放80端口,SELinux - osc_a3uwfsx7的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. AXI 基础第 4 讲 - 使用 AXI VIP 作为 AXI4 主接口的协议检查工具
  11. 2021国内软件开发培训机构排名,避坑必看!
  12. 怎么在电脑设置html,电脑怎么定时开机
  13. 获取docker容器里面的root权限
  14. 我的无线宽带由器 TP-LINK TL-WR841N如何设置限
  15. 计算机科学丛书 图灵,图灵计算机科学丛书
  16. excel如何把多张表合并成一个表_如何快速把多个excel表格合并成一个excel表
  17. QQ2005Beta3与输入法组件冲突的解决办法(转)
  18. spicy.parser
  19. Data Analysis - Day2 - Matplotlib 案例
  20. Halcon OCR字符识别

热门文章

  1. 详解:IDEA不能自动加载import问题
  2. mysql 内存太大被杀_数据库mysqld进程频繁被杀解决方案[终]
  3. java 线程等待队列_Java多线程学习(五)——等待通知机制
  4. pythoncopy函数_Python的shutil模块中文件的复制操作函数详解
  5. 嵌入式论文3000字_普通期刊发表论文费用是多少
  6. LeetCode 105. 从前序与中序遍历序列构造二叉树(递归)
  7. caffe-yolov3:编译安装报错:fatal error: caffe/caffe.hpp: No such file or directory
  8. 云南省电子计算机高级,计算机基础知识-云南省电子信息高级技工学校.ppt
  9. c#事件的发布-订阅模型_NET Core 3 WPF MVVM框架 Prism系列之事件聚合器
  10. CSharpGL(53)漫反射辐照度