📜  Matlab用户的NumPy

📅  最后修改于: 2021-04-16 09:04:07             🧑  作者: Mango

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)