Skip to content

Commit ea5d4e0

Browse files
committed
更新至最新Numpy版本
1 parent b31069c commit ea5d4e0

File tree

1 file changed

+22
-37
lines changed

1 file changed

+22
-37
lines changed

5.NumPy-for-Matlab-users/NumPy_for_Matlab_users.md

Lines changed: 22 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,10 @@
66
- [“array” 还是 “matrix”? 我应该选谁?](#array-还是-matrix-我应该选谁)
77
- [简要的回答](#简要的回答)
88
- [详细的回答](#详细的回答)
9-
- [使用Matrix的用户的福音](#使用matrix的用户的福音)
109
- [MATLAB和NumPy粗略的功能对应表](#matlab和numpy粗略的功能对应表)
1110
- [一般功能的对应表](#一般功能的对应表)
1211
- [线性代数功能对应表](#线性代数功能对应表)
13-
- [备注](#备注)
12+
- [注释](#注释)
1413
- [自定义环境](#自定义环境)
1514
- [链接](#链接)
1615

@@ -95,25 +94,11 @@ NumPy包含`array`类和`Matrix`类。`array`类旨在成为用于多种数值
9594

9695
因此,使用数组要明智得多。事实上,我们打算最终弃用矩阵类型。
9796

98-
## 使用Matrix的用户的福音
99-
100-
NumPy有一些特性,可以方便地使用``matrix``类型,这有望使Matlab的用户转化过来更为容易。
101-
102-
- 新增了一个``matlib``模块,该模块包含常用数组构造函数的矩阵版本,如one()、zeros()、empty()、view()、rand()、repmat()等。通常,这些函数返回数组,但matlib版本返回矩阵对象。
103-
- ``mat`` 已被更改为``asmatrix``的同义词,而不是矩阵,从而使其成为将数组转换为矩阵而不复制数据的简洁方法。
104-
- 一些顶级的函数已被删除。例如,``numpy.rand()``现在需要作为``numpy.random.rand()``访问。或者使用``matlib``模块中的``rand()``。但是“numpythonic”方式是使用``numpy.random.random()``,它为元组数据类型作为shape(形状),就像其他numpy函数一样。
10597

10698
## MATLAB和NumPy粗略的功能对应表
10799

108-
下表粗略的反应了一些常见MATLAB表达式的大致对应关系。**但这些并不完全等同**,而是作为一种指引,指引读者一个正确的反向。有关更多详细信息,请参阅NumPy函数的内置文档。
109-
110-
在编写以数组或矩阵作为参数的函数时,需要注意一点,就算如果你期望函数返回一个 ``array``, 传入的参数却是一个 ``matrix``,或反之亦然,那么 ``*`` (乘法运算符) 会给你带来意想不到的惊喜。它可以在数组和矩阵之间来回转换。
111-
112-
- ``asarray``: 总是返回一个 ``array`` 类型的对象。
113-
- ``asmatrix````mat``: 总是返回一个 ``matrix`` 类型的对象。
114-
- ``asanyarray``: 始终返回数组对象或数组对象派生的子类,具体取决于传入的类型。例如,如果传入一个``matrix``,它将返回一个``matrix``
100+
下表粗略的反应了一些常见MATLAB表达式的大致对应关系。这些并不是完全等价的,而是应该作为提示来引导您走向正确的方向。有关更多详细信息,请参阅NumPy函数的内置文档。
115101

116-
这些函数都接受数组和矩阵(除了别的类型哈,比如Python的list类型之类的),因此在编写应该接受任何类似数组的对象的函数时很有用。
117102

118103
在下表中,假设你已经在Python中执行了以下命令:
119104

@@ -122,21 +107,21 @@ from numpy import *
122107
import scipy.linalg
123108
```
124109

125-
另外如果下表中的``注释``这一列的内容是和``matrix``有关的话,那么参数一定是二维的形式。
110+
另外如果下表中的`注释`这一列的内容是和`matrix`有关的话,那么参数一定是二维的形式。
126111

127112
### 一般功能的对应表
128113

129114
MATLAB | NumPy | 注释
130115
---|---|---
131-
``help func`` | ``info(func)````help(func)````func?`` (在 Ipython 中) | 获得函数func的帮助。
132-
``which func`` | see note HELP(译者注:在里的原链接已经失效。) | 找出func定义的位置。
133-
``type func`` | ``source(func)````func??`` (在 Ipython 中) | 打印func的源代码(如果不是原生函数的话)。
134-
``a && b`` | ``a and b`` | 短路逻辑 AND 运算符 (Python 原生运算符); 仅限标量参数。
135-
``a \|\| b`` | ``a or b`` | 短路逻辑 OR 运算符 (Python 原生运算符); 仅限标量参数。
136-
``1*i, 1*j, 1i, 1j`` | ``1j`` | 复数。
137-
``eps`` | ``np.spacing(1)`` | 数字1和最近的浮点数之间的距离。
138-
``ode45`` | ``scipy.integrate.solve_ivp(f)`` | 将ODE与Runge-Kutta 4,5整合在一起。
139-
``ode15s`` | ``scipy.integrate.solve_ivp(f, method='BDF')`` | 用BDF方法整合ODE。
116+
help func | info(func) 或 help(func) 或 func? (在 Ipython 中) | 获得函数func的帮助。
117+
which func | see note HELP(译者注:在里的原链接已经失效。) | 找出func定义的位置。
118+
type func | source(func) 或 func?? (在 Ipython 中) | 打印func的源代码(如果不是原生函数的话)。
119+
a && b | a and b | 短路逻辑 AND 运算符 (Python 原生运算符); 仅限标量参数。
120+
a \|\| b | a or b | 短路逻辑 OR 运算符 (Python 原生运算符); 仅限标量参数。
121+
1\*i, 1\*j, 1i, 1j | 1j | 复数。
122+
eps | np.spacing(1) | 数字1和最近的浮点数之间的距离。
123+
ode45 | scipy.integrate.solve_ivp(f) | 将ODE与Runge-Kutta 4,5整合在一起。
124+
ode15s | scipy.integrate.solve_ivp(f, method='BDF') | 用BDF方法整合ODE。
140125

141126
### 线性代数功能对应表
142127

@@ -175,8 +160,8 @@ a(:) = 3 | a[:] = 3 | 将所有值设置为相同的标量值
175160
y=x | y = x.copy() | numpy 通过拷贝引用来赋值。
176161
y=x(2,:) | y = x[1,:].copy() | numpy 通过拷贝引用来切片操作。
177162
y=x(:) | y = x.flatten() | 将数组转换为向量(请注意,这将强制拷贝)。
178-
1:10 | arange(1.,11.) 或 r_[1.:11.] 或 r_[1:10:10j] | 创建一个可增长的向量 (参见下面的[注释](#note)章节)
179-
0:9 | arange(10.) 或 r_[:10.] 或 r_[:9:10j] | 创建一个可增长的向量 (参见下面的[注释](#note)章节)
163+
1:10 | arange(1.,11.) 或 r_[1.:11.] 或 r_[1:10:10j] | 创建一个可增长的向量 (参见下面的[备注](#备注)章节)
164+
0:9 | arange(10.) 或 r_[:10.] 或 r_[:9:10j] | 创建一个可增长的向量 (参见下面的[备注](#备注)章节)
180165
[1:10]' | arange(1.,11.)[:, newaxis] | 创建一个列向量。
181166
zeros(3,4) | zeros((3,4)) | 创建一个全是0的填充的 3x4 的64位浮点类型的二维数组。
182167
zeros(3,4,5) | zeros((3,4,5)) | 创建一个全是0的填充的 3x4x5 的64位浮点类型的三维数组。
@@ -208,7 +193,7 @@ rank(a) | linalg.matrix_rank(a) | 二维数组或者矩阵的矩阵rank。
208193
a\b | 如果a是方形矩阵 linalg.solve(a,b) ,否则:linalg.lstsq(a,b) | 对于x,x = b的解
209194
b/a | Solve a.T x.T = b.T instead | 对于x,x a = b的解
210195
[U,S,V]=svd(a) | U, S, Vh = linalg.svd(a), V = Vh.T | a数组的奇值分解
211-
chol(a) | linalg.cholesky(a).T | 矩阵的cholesky分解(matlab中的``chol(a)``返回一个上三角矩阵,``linalg.cholesky(a)``返回一个下三角矩阵)
196+
chol(a) | linalg.cholesky(a).T | 矩阵的cholesky分解(matlab中的chol(a)返回一个上三角矩阵,但linalg.cholesky(a)返回一个下三角矩阵)
212197
[V,D]=eig(a) | D,V = linalg.eig(a) | a数组的特征值和特征向量
213198
[V,D]=eig(a,b) | V,D = np.linalg.eig(a,b) | a,b数组的特征值和特征向量
214199
[V,D]=eigs(a,k) | - | 找到a的k个最大特征值和特征向量
@@ -221,18 +206,18 @@ sort(a) | sort(a) or a.sort() | 对矩阵或者数组进行排序
221206
[b,I] = sortrows(a,i) | I = argsort(a[:,i]), b=a[I,:] | 对矩阵或数组的行进行排序
222207
regress(y,X) | linalg.lstsq(X,y) | 多线性回归
223208
decimate(x, q) | scipy.signal.resample(x, len(x)/q) | 采用低通滤波的下采样
224-
``unique(a)`` | ``unique(a)`` | -
225-
``squeeze(a)`` | ``a.squeeze()`` | -
209+
unique(a) | unique(a) | -
210+
squeeze(a) | a.squeeze() | -
226211

227-
## 备注
212+
## 注释
228213

229-
**子矩阵**: 可以使用ix_命令使用索引列表完成对子矩阵的分配。例如,对于2d阵列a,有人可能会这样做: ``ind=[1,3]; a[np.ix_(ind,ind)]+=100``.
214+
**子矩阵**: 可以使用ix_命令使用索引列表完成对子矩阵的分配。例如,对于2d阵列a,有人可能会这样做: `ind=[1,3]; a[np.ix_(ind,ind)]+=100`.
230215

231-
**帮助方面**: 没有直接等同于MATLAB的``which``的命令,但是命令``help````source``通常会列出函数所在的文件名。Python还提供了一个检查模块(do ``import inspect``),该模块提供了一个经常被使用到的`getfile``方法。
216+
**帮助方面**: 没有直接等同于MATLAB的`which`的命令,但是命令`help``source`通常会列出函数所在的文件名。Python还提供了一个检查模块(do `import inspect`),该模块提供了一个经常被使用到的`getfile``方法。
232217

233218
**索引方面**: MATLAB® 使用基于1的索引,因此序列的初始元素具有索引1。Python使用基于0的索引,因此数组的初始元素的索引为0。之所以有如此天壤之别,是因为它们各有优缺点。使用基于1的索引是和常见的人类语言用法是一致的,前者是序列的 “第一个” 元素的索引是1。而后者基于0的索引简化了索引。另见pro.dr的文本。
234219

235-
**范围**: 在 MATLAB® 中,0:5既可以用作范围文字索引,也可以用作“片”索引(括号内);然而,在Python中,像0:5这样的结构只能用作片索引(方括号内)。因此,创建了有点奇怪的r_Object,以允许numpy具有类似的简洁范围构造机制。请注意,r_不像函数或构造函数那样被调用,而是使用方括号进行索引,这允许在参数中使用Python的切片语法。
220+
**范围**: 在 MATLAB® 中,`0:5`既可以用作范围文字索引,也可以用作“片”索引(括号内);然而,在Python中,`0:5`这样的结构只能用作片索引(方括号内)。因此,创建了有点奇怪的`r_`对象,以允许numpy具有类似的简洁范围构造机制。请注意,`r_`不像函数或构造函数那样被调用,而是使用方括号进行索引,这允许在参数中使用Python的切片语法。
236221

237222
**逻辑运算**: & 或者 | 在NumPy中是按位的 AND/OR,而在Matlab中 & 和 | 是逻辑 AND/OR。对于任何有丰富编程经验的人来说,这一区别应该是显而易见的。这两种方法表面上看起来是一样的,但也有重要的区别。如果你要使用Matlab的& 或 | 操作符,则应该使用NumPy函数的logicaland/logicalor。Matlab 的运算符 与 NumPy 的 & 和 | 运算符的显著区别是:
238223

@@ -248,7 +233,7 @@ decimate(x, q) | scipy.signal.resample(x, len(x)/q) | 采用低通滤波的下
248233

249234
NumPy,或者更确切地说是Python,具有类似的功能。
250235

251-
- 要修改Python搜索路径以包含自己模块的位置,请定义``PYTHONPATH``的环境变量。
236+
- 要修改Python搜索路径以包含自己模块的位置,请定义`PYTHONPATH`的环境变量。
252237
- 要在启动交互式Python解释器时执行特定的脚本文件,请定义“PYTHONSTARTUP”环境变量以包含启动脚本的名称。
253238

254239
与MATLAB®不同,可以立即调用路径上的任何内容,使用Python,你需要先执行“import”语句,以使特定文件中的函数可访问。

0 commit comments

Comments
 (0)