NumPy和Matlab彼此非常相似,都是为了数学和科学计算而设计的。但是仍然存在许多差异,使用numPy使用Python使用数组进行科学计算,而Matlab使用矩阵。本文将为我们提供有关NumPy与Matlab之间的异同以及Matlab用户如何精通NumPy的深刻思想。
NumPy同时使用数组和矩阵。 NumPy提供了一种特殊的矩阵numpy.matrix,它是ndarray的子类(即n维数组)。 NumPy的基本数据类型是n维数组,其中按元素进行操作。必须使用特定的函数在NumPy中执行线性代数运算。 Matlab的基本数据类型是双精度浮点数的多维数组。对此类数据类型的实例的操作就像线性代数中的矩阵一样执行,Matlab中的大多数内置函数都采用并返回此类数组。 NumPy是为Python设计的,它是一种通用编程语言,它使用基于0(零)的索引。虽然Matlab的脚本语言是为执行线性代数运算而创建的,但是Matlab用于某些数组操作的语法比NumPy的更为复杂。 Matlab也使用基于1(一个)的索引,这意味着数组的第一个元素的索引为1。
从这个基本的谈话中,出现了一个问题,我们应该使用数组还是矩阵?
NumPy提供数组类和矩阵类,数组类提供基本的n维数组计算,而矩阵类专门提供线性代数计算。数组对象和矩阵对象之间的一些关键区别是:
- 高维数组的处理:
- 数组对象可以具有两个以上的维,而
- 矩阵对象只有二维。
- 向量的处理(一维数组):
- 在数组对象中,一维数组将始终具有一维。对于数组,N * 1和1 * N是二维数组,而不是一维数组。一维数组上的数组操作将始终返回一维数组本身。
- 而在矩阵中,将大小为N的一维数组作为,默认情况下转换为N * 1或1 * N矩阵。对它的任何操作都将始终返回二维数组。
- 运算符’*’和’@’:-
- 在数组中,’*’运算符用于元素明智的乘法或使用函数multiple(),而’@’用于矩阵乘法或使用函数dot()。
- 在矩阵中,矩阵乘法是使用’*’运算符的,对于元素明智的乘法,必须使用multiple()函数。
- 构造函数:-
- 在数组中,构造函数使用Python序列进行初始化。 eg- array([[1、2、3],[4、5、6]])
- 在矩阵中,构造函数将字符串作为初始化程序。例如:matrix(“ [[1 2 3; 4 5 6]”)
NumPy的一些常见Matlab等效项:
一般用途:
Matlab | NumPy | Explanation |
type(func) | source(func) or func??(for python) | prints source of the function |
a | | b | a or b | Logical OR operator |
eps | np.spacing(1) | Distance between 1 and nearest floating point number |
1 * i, 1 * j, 1i, 1j | 1j | Complex Numbers |
help(func) | info(func) or help(func) (for python) | Provides for the given func function |
a && b | a and b | Logical AND operator |
对于线性代数:
Matlab | NumPy | Explanation |
size(m) | shape(a) or a.shape(a) | Returns the size of matrix |
[1 2 3; 7 8 9] | array([[1, 2, 3], [7, 8, 9]]) | 2×3 matrix |
m(end) | m[-1] | Last element in 1xn matrix |
m(3, 4) | m[3][4] | Access element in 3rd row, 4th element |
m(2 : ) | m[1] or m[1, : ] |
Entire second row of matrix, as matlab’s first element is indexed at 1 and that of numpy is indexed at 0. |
m(1 : 5, : ) | m[0 : 5] or m[ : 5] | returns first five rows of matrix m |
m.’ | m.transpose() or a.T | Transpose of matrix m |
m’ | m.conj().transpose() or m.conj().T | Conjugate transpose of matrix m |
m.^3 | m**3 | Element wise exponent of matrix m. |
m .* n | m *n | Element wise matrix multiply |
m * n | m @ n | Matrix multiplication (algebric operation) |
a ./ b | a / b | Element wise divide of matrix m and n. |
find(m > 2) | nonzero(m > 2) | Find the indices whose elements are greater then 2 |
m( : ) = 1 | m[ : ] = 1 | Set all the elements of matrix m to 1 |
a = b | a = b.copy() |
Assign b into a directly in Matlab while numpy assigns through reference. |
zeros(2, 4) | zeros((2, 4)) |
two dimensional array with 2 rows and 4 columns full with all elements as 0 (zero). |
zeros(1, 3, 5) | zeros((1, 3, 5)) | 1x3x5 three dimensional array with all elements zero. |
rand(2, 4) | randomn.rand(2, 4) | 2×4 two dimensional array with random elements. |
ones(2, 4) | ones((2, 4)) |
2×4 two dimensional array with all elements floating point 1. |
eye(4) | eye(4) | returns 4×4 identity matrix |
max(max(m)) | max(m) | returns maximum element present in matrix m |
a | b | logical_or(a, b) | element by element logical OR operation |
a & b | logical_and(a, b) | element by element logical AND operation |
bitor(a, b) | a | b | Bitwise logical OR operator of matrices a and b |
bitand(a, b) | a & b | bitwise logical AND operator of matrices a and b |
sort(m) | sort(m) or m.sort() | sort the matrix m |
ifft(m) | ifft(m) | Fourier transform of matrix m. |
a\b |
linalg.solve(a, b) if a is square matrix else, linalg.lstsq(a, b) |
solve the equation a x = b, for x |
inv(m) | linalg.inv(m) | returns inverse of square matrix m |
pinv(m) | linalg.pinv(m) | returns pseudo inverse of matrix m |
max(m, n) | maximum(m, n) |
returns max element from each pair by comparing m and n element by element. |
max(m) | m.max(0) |
returns maximum element from each column of matrix m. |
linspace(a, b, m) | linspace(a,, b, m) |
returns m equally spaced elements between a and b (both inclusive) |