分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.csdn.net/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
诚然,没有一门语言能够撼动matlab的矩阵或科学计算在学术圈的地位,因其简洁的语法(matrix是其基本数据类型),因其矩阵运算的便捷,因其术业有专攻(matlab:为科学计算而生),因其名字matlab:matrix laboratory,所在的公司名mathworks:math works。我在写过一些matlab和python的代码之后,油然发过一句感慨“没有一门语言能比matlab还更具数学感”。然而,因为
numpy
、pandas
和matplotlib
等一众优秀的开发者(不排除从matlab阵营溜出来的)贡献的一众优秀的开源的库,让python具备了和matlab一样的功能,为工程而生的python从此因为有了数学家的参与就相当初的matlab一样,也学术起来,工程学术通吃。
本文试图回答的问题包括:
- 为什么矩阵运算要从matlab迁移到python?
- 如何进行迁移,其中会涉及哪些基本编程理念的差异?
- 迁移的过程中需要注意哪些细节?
python矩阵运算,更准确地说,是numpy矩阵运算,为了更为方便地使用numpy库,如下文使用的那样,我们需要导入numpy库并重命名为np
import numpy as np
- 1
零、编程理念的对比
0.1 编程范式
matlab是面向过程的编程方式,而python既支持面向过程又支持面向对象,是一种多范式(multi paradigms)的编程语言。因此,不难理解python编程语言中广泛存在的以下的两种等价实现方式:
np.dot(X, w) # 调用全局函数,面向过程的编程方式X.dot(w) # 调用对象的成员函数,面向对象的编程方式
- 1
- 2
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)
- 1
- 2
- 3
- 4
0.2.2 对python而言:
A.shape[0] # 行数, axis = 0A.shape[1] # 列数, axis = 1# 等价的(或者叫面向过程的)表达方式np.shape(A)[0]np.shape(A)[1]# 可从0开始索引矩阵的行r = A.shape[0]A[0:r, :]
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
0.3 matlab矩阵索引用的是小括号,python是中括号
小括号对于一种支持面向对象、支持运算符重载的语言来说,具有特别的意义,重载括号运算符是仿函数实现的命门。如果了解c++的运算符重载机制,一个类如果重载了括号运算符,便可称作仿函数,把一个类当做函数来使用。恰好,python也支持运算符重载。
class Prob(object): def __init__(self, lhs): self.lhs = lhs def __call__(self, rhs): return self.lhs * rhs # def __call__(self, lhs, rhs) # return lhs * rhsif __name__ == '__main__': p = Prob(2) # 调用的是类构造函数,也即__