一、Numpy是什么
Numpy代表"Numerical Python’,那么Numpy是什么呢?
Numpy是一个python的数字库
NumPy包含多维数组和矩阵数据结构
数组结构支持与三角、统计、和线性代数相关的大部分函数。
Numeric和Nuarray的扩展
Numpy包含随机数发生器
Numpy使用C语言实现和封装
Pandas对象是建立在Numpy基础上的,实现了对Numpy的扩展
Scipy(Scientifc Python)和MatplotLib(Plotting Library)和它是好搭档,具备与和Matlab扳扳手腕的能力。
二、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)1
object sequence序列及其嵌套。python中序列有:list[],tuple()和range。
另外,python中的参数可不必按照定义顺序传入参数,方法是使用“关键字+值”的方式。如:
A=np.array([[1,2],[2,3],[3,2]],dtype='int64')1
赋值构造函数是浅拷贝
A=B1
其他函数
统计类函数
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)1
函数参数如下表:
参数含义a待排数组
axis排序方向,默认为最后一维
kind'quicksort’默认 ‘merge sort’ ‘heap sort’
orderarray含多个元素时待排元素名称
函数
三角函数: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 n
运算符重载
四则运算
三、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])1
这种数组为列向量。
要创建包含多行的矩阵,请传入嵌套的list对象:
a=np.array([[1,2,3],[4,5,6],[7,8,10])1
创建矩阵的另一种方法是使用ones、zeros、rand和empty等函数[1]。例如创建一个由零组成的5*1列向量:
np.ones((5,1))1
shape类型可以是tuple()或者list[],np.empty等价于matlab中的:
A=[]1
3.2 矩阵和数组运算
python允许您使用单一的算数运算符或函数来处理矩阵中的所有值。
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(a+10)1
2
结果如下:
这里python和matlab也有一点不一样,python没有将结果默认输出至终端的操作,因此,需要我们手动加上print。
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(np.sin(a))1
2
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))1
2
3
结果如下:
matlab选择直接使用单引号来表达该运算。
您可以使用 dot或者matmul 运算符执行标准矩阵乘法,这将计算行与列之间的内积。例如,确认矩阵乘以其逆矩阵可返回单位矩阵:
a=np.array([[1,2,3],[4,5,6],[7,8,10]])
print(np.dot(a,np.linalg.inv(a)))1
2
结果如下:
注意事项:在python得np.array类中,矩阵运算和matlab有较大差异。matlab使用.*表示点乘,*表示矩阵乘法,dot则表示维点积;而python将*或multiply定义成点乘,vdot定义成点积,矩阵乘法则为dot或者matdot;倒是叉积得结果两者是统一的。
求逆运算,python封装在np中的线性代数算法中np.linalg中,名称和matlab一样是inv,matlab还对矩阵的-1次方进行了重载,也表示求逆。
乘法、除法和幂的矩阵运算是对于每个元素的操作,类似数乘:
a=np.array([1,2,3])
print(pow(a,3))1
2
结果如下:
串联
串联是连接数组以便形成更大数组的过程。python通过调用vstack和hstack来完成串联操作。
a=np.array([1,2,3])
b=np.array([4,5,6])
print(np.hstack([a,b,b,b]))1
2
3
结果如下:
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,:])1
2
小结: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