Numpy(一)np.array与matlab matrix对比
一、Numpy是什么Numpy代表"Numerical Python’,那么Numpy是什么呢?Numpy是一个python的数字库NumPy包含多维数组和矩阵数据结构数组结构支持与三角、统计、和线性代数相关的大部分函数。Numeric和Nuarray的扩展Numpy包含随机数发生器Numpy使用C语言实现和封装Pandas对象是建立在Numpy基础上的,实现了对Numpy的扩展Scipy(Sci
A=np.array([[1,2,3],[4,5,6]])
print(A)
print(A.ndim) # 行 2
print(len(A)) # 行 2
print(A.shape) # 行列元组 (2,3)
print(A.shape[0]) # 元组第一个表示行 2
print(A.shape[1]) # 元组第二个表示列 3
print(np.size(A,0)) # size方法, 行 2
print(np.size(A,1)) # size方法, 列 3
print(A.size) # 元素总数
一、访问单个元素,Matlab A(2,3),numpy A[2,3]或A[2][3]
二、某列,Matlab A(:,k),numpy A[:,k]
三、Axis=0是列,Axis=1是行
一、Numpy是什么
Numpy代表"Numerical Python",那么Numpy是什么呢?
- Numpy是一个python的数字库
- NumPy包含多维数组和矩阵数据结构
- 数组结构支持与三角、统计、和线性代数相关的大部分函数。
- Numeric和Nuarray的扩展
- Numpy包含随机数发生器
- Numpy使用C语言实现和封装
- Pandas对象是建立在Numpy基础上的,实现了对Numpy的扩展
- Scipy(Scientifc Python)和MatplotLib(Plotting Library)和它是好搭档,具备与和Matlab扳扳手腕的能力。
因为numpy对矩阵的支持,像是sin(M)处理一一些列的数成为可能,不然你还得一个个处理。
二、Ndarray Object
要了解一门面向对象的语言,最好的办法就是从数据成员、成员函数来认识它。
2.1 数据成员
| 数据成员 | 含义 |
|---|---|
| ndarray.ndim | 列数(矩阵而言) |
| ndarray.shape | 维度信息(3,5),元组数据类型 |
| ndarray.size | 总元素个数 |
| ndarray.dtype | 元素类型 |
| ndarray.itemsize | 元素所占字节数 |
| ndarray.data | 内存位置 |
2.2 成员函数
python函数参数可以是
- 构造函数
numpy.array(object, dtype = None, copy = True, order = None, subok = False, ndmin = 0)
object sequence序列及其嵌套。python中序列有:list[],tuple()和range。
另外,python中的参数可不必按照定义顺序传入参数,方法是使用“关键字+值”的方式。如:
A=np.array([[1,2],[2,3],[3,2]],dtype='int64')
注意:np.array([1,2,3])构造的既不是行向量也不是行向量,是一个shape只有一个的tuple。
赋值构造函数是浅拷贝
A=B
- 其他函数
- 统计类函数
sort mean max min sum std var cumsum cumprod argmax argmin corrcoef cov fabs ceil floor round fmod(余数)
如sort函数:
numpy.sort(a, axis, kind, order)
函数参数如下表:
| 参数 | 含义 |
|---|---|
| a | 待排数组 |
| axis | 排序方向,默认为最后一维 |
| kind | 'quicksort’默认 ‘merge sort’ ‘heap sort’ |
| order | array含多个元素时待排元素名称 |
例子:对矩阵 M = [ 3 8 − 1 5 10 − 2 4 − 1 3 5 8 10 ] M=\begin{bmatrix}3&8&-1\\5&10&-2\\4&-1&3\\5&8&10\end{bmatrix} M= 3545810−18−1−2310 按行和列排序:
import numpy as np
M=np.array([[3,8,1],[5,10,-2],[4,-1,3],[5,8,10]])
sorted_M=np.sort(M) #默认快排,且为axis=0(列方向),由小到大
sorted_M=np.sort(M,axis=0); #同上等价表达
sorted_MM=np.sort(M,axis=1); #aixs=1行方向
我对numpy中轴的理解,以上面的矩阵 M M M为例,np.array中第一个中括号表示第1个轴,该轴存放着4个元素(也叫做长度,这就是为什么我们可以用len来表示行的原因),因为元素的内容不是单纯的数字,内含中括号,所以需要第二个轴来用来检索这个元素,上面放着三个数字。至此所有元素都是数字,所以这个array的总轴数为2。
-
函数
三角函数:sin cos tan等;常见函数:power sqrt exp square log2 log10 log modf(小数和整数部分);矩阵构造:eyes ones empty rand -
数学常量
pi e -
其他库
np.random np.linalg np.polynomial np.fft np.mean np.std
- 运算符重载
四则运算
三、Compare with matlab
在matlab使用doc+命令名可以查看对应函数用法,spyder则使用help+命令名,spyder的快捷键为ctrl+I,我习惯把他设置为F1。按照matlab教程来探索一下,python中的narray!
https://ww2.mathworks.cn/help/matlab/learn_matlab/matrices-and-arrays.html
3.1 数组的创建
创建每行包含四个元素的数组,调用构造函数,传入一个list对象:
a=np.array([1,2,3,4])
这种数组为列向量。
要创建包含多行的矩阵,请传入嵌套的list对象:
a=np.array([[1,2,3],[4,5,6],[7,8,10]])

创建矩阵的另一种方法是使用ones、zeros、rand和empty等函数[1]。例如创建一个由零组成的5*1列向量:
np.ones((5,1))
shape类型可以是tuple()或者list[],np.empty等价于matlab中的:
A=[]
3.2 矩阵和数组运算
python允许您使用单一的算数运算符或函数来处理矩阵中的所有值。
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(a+10)
结果如下:
这里python和matlab也有一点不一样,python没有将结果默认输出至终端的操作,因此,需要我们手动加上print。
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(np.sin(a))
matlab将基本的函数都封装在全局作用域中,而python需要调用numpy来完成。
要转置矩阵,请使用np.transpose成员函数,或者.T
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(a.T)
print(np.transpose(a))
结果如下:
matlab选择直接使用单引号来表达该运算。
您可以使用 dot或者matmul 运算符执行标准矩阵乘法,这将计算行与列之间的内积。例如,确认矩阵乘以其逆矩阵可返回单位矩阵:
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(np.dot(a,np.linalg.inv(a)))
结果如下:
**注意事项:在python的np.array类中,矩阵运算和matlab有较大差异。
| 对比项 | 矩阵乘法 | 对应元素相乘(点乘、内积) | 点积(内积后加起来的一个数) | 差积 |
|---|---|---|---|---|
| MATLAB | 星号(*) | .* |
dot() | cross |
| np.array | dot()或matmul或@ | * 或multiply |
vdot | cross |
求逆运算,python封装在np中的线性代数算法中np.linalg中,名称和matlab一样是inv,matlab还对矩阵的-1次方进行了重载,也表示求逆。
乘法、除法和幂的矩阵运算是对于每个元素的操作,类似数乘:
a=np.array([1,2,3])
print(pow(a,3))
结果如下:

串联
串联是连接数组以便形成更大数组的过程。python通过调用vstack和hstack来完成串联操作。
a=np.array([1,2,3])
b=np.array([4,5,6])
print(np.hstack([a,b,b,b]))
结果如下:

vstack和hstack支持tuple、list且可以多次拼接。
这一点和matlab又有所区别,matlab则使用了中括号[] 、;和,表征矩阵的拼接。
复数
和matlab一样,python同样支持复数操作,不过使用字母j来表示复数。Matlab对复数i和j都进行了辨识,且系数为1时也可以不写,符合人的书写习惯。
ps:1+i复数应该写成1+1j,1是不可省略的。
切片
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(a[0:2,:]) #m:n的m和n在矩阵两端时,可以省略,也就是可以写成a[:2,:]
特别的,访问单个元素,有两种访问方式:
a[2,3]
a[2][3]
小结:Matlab的矩阵操作,相对于Numpy.array而言,Matlab更加顺手、更加简洁:
- Matlab符号利用率高,人性化。如转置
',范围[s:step:e]、^n求n次方-1求逆,i或j复数都可以表示,同时系数为1时不用写成1j,拼接的时候[,]和[;]表意明确,不用额外调用函数 - Matlab的函数都封装在其大命名空间,不需要通过对象调用 cross max等
要注意区别:
- Matlab下标从1开始,而np.array则从0开始
- 范围[s:step:e]是闭区间,np.arrange(s,e,step)左闭右开
- 在一些函数上有区别,如Matlab的矩阵间的*表示的是矩阵乘法,而在Python中则为点乘
[1]https://ww2.mathworks.cn/help/matlab/learn_matlab/matrices-and-arrays.html
[2](Why Should We Use NumPy?) https://medium.com/fintechexplained/why-should-we-use-numpy-c14a4fb03ee9
更多推荐




所有评论(0)