官方文档
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’orderarray含多个元素时待排元素名称例子:对矩阵 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
- 运算符重载 四则运算
在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有较大差异。
.*
dot()crossnp.arraydot()或matmul*
或multiply
vdotcross
求逆运算,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