Python学习(四)数组和矩阵
参考资料:
https://github.com/lijin-THU/notes-python(相应实体书为:《自学Python——编程基础、科学计算及数据分析》)
一、生成数组的函数
1. arange()函数:类似于python中的range()函数,只不过返回的不是列表,而是返回数组
(1)arange(start, stop=None, step=1, dtype=None) //产生一个在区间 [start, stop)
之间(不包括stop),以 step
为间隔的数组,如果只输入一个参数,则默认从 0
开始,并以这个值为结束,数组类型由dtype指定
(2)与 range
不同, arange
允许非整数值输入,产生一个非整型的数组:np.arange(0, 2 * np.pi, np.pi / 4) 或 np.arange(0, 2 * np.pi, np.pi / 4, dtype=np.float32)
注:由于存在精度问题,使用浮点数可能出现问题,如 np.arange(1.5, 2.1, 0.3) 返回 array([1.5, 1.8, 2.1]) 终点stop的值2.1出现在数组中
2. linspace()函数:linspace(start, stop, N) 产生 N
个等距分布在 [start, stop]
间的元素组成的数组,包括 start, stop
3. logspace()函数:logspace(start, stop, N) 产生 N 个对数等距分布的数组,默认以10为底
np.logspace(0, 1, 5) //产生的值为$[10^{0}, 10^{0.25}, 10^{0.5}, 10^{0.75}, 10^{1}]$
4. meshgrid()函数:在二维平面生成网格
1 x_ticks = np.linspace(-1, 1, 5) 2 y_ticks = np.linspace(-1, 1, 5) 3 4 x, y = np.meshgrid(x_ticks, y_ticks)
x: array([[-1. , -0.5, 0. , 0.5, 1. ],
[-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ], [-1. , -0.5, 0. , 0.5, 1. ]])
y: array([[-1. , -1. , -1. , -1. , -1. ],
[-0.5, -0.5, -0.5, -0.5, -0.5], [ 0. , 0. , 0. , 0. , 0. ], [ 0.5, 0.5, 0.5, 0.5, 0.5], [ 1. , 1. , 1. , 1. , 1. ]])
注:可以添加 sparse
的选项以避免冗余,x, y = np.meshgrid(x_ticks, y_ticks, sparse=True) //生成的x、y分别为单一的行向量和列向量
(1)meshgrid
可以设置轴排列的先后顺序:
- 默认为
indexing='xy'
即笛卡尔坐标,对于2维数组,返回行向量x
和列向量y
- 或者使用
indexing='ij'
即矩阵坐标,对于2维数组,返回列向量x
和行向量y
(2)matlab中meshgrid用法有:meshgrid(-1:.5,1, -1:.5:1);相应的, 在numpy中使用ogrid和mgrid函数
ogrid
与 mgrid
的区别在于:
ogrid
相当于meshgrid(indexing='ij', sparse=True)
mgrid
相当于meshgrid(indexing='ij', sparse=False)
注:
- 这里使用的是中括号
- Matlab 使用的是
start:step:end
的表示,Numpy 使用的是start:end:step
的表示 - 这里的结果不包括
end
的值
为了包含 end
的值,可以使用这样的技巧:
x, y = np.ogrid[-1:1:5j, -1:1:5j] //在 step
的位置传入一个复数 5j
,表示需要一个 5
个值的数组,此时返回值就会包含 end
的值(复数步长指定数组长度)
5. 使用 r_ / c_
来产生行向量或者列向量
1 np.r_[0:1:.1] #使用切片产生行向量 2 np.r_[0:1:5j] #使用复数步长指定数组长度 3 np.r_[(3,22,11), 4.0, [15, 6]] #连接多个序列 4 np.r_[(3,22,11), 4.0, [15, 6]] #列向量
6. 产生全0和全1数组:ones(shape, dtype=float64)、zeros(shape, dtype=float64)
1 np.zeros(3) 2 np.ones([2,3], dtype=np.float32)
3 np.ones([2,3]) * 5 #产生全是5的数组
7. empty()函数:empty(shape, dtype=float64, order='C')
可以使用 empty
方法产生一个指定大小的数组(数组所指向的内存未被初始化,值随机),再用 fill
方法填充
1 a = np.empty(2) 2 a.fill(5) 3 a[:] = 5 #使用索引方法,速度稍慢一点
8. empty_like(a)、ones_like(a)、zeros_like(a):产生一个跟 a
大小一样,类型一样的对应数组
9. identity(n, dtype=float64):产生一个 n
乘 n
的单位矩阵,如 identity(3)
二、矩阵
1. 使用 mat 方法将2维数组转化为矩阵
1 import numpy as np 2 a = np.array([[1,2,4], 3 [2,5,3], 4 [7,8,9]]) 5 A = np.mat(a) #type(A)
2. 使用 Matlab 的语法传入一个字符串来生成矩阵
1 A = np.mat('1,2,4;2,5,3;7,8,9')
3. 利用分块创造新的矩阵
1 a = np.array([[ 1, 2], 2 [ 3, 4]]) 3 b = np.array([[10,20], 4 [30,40]]) 5 6 np.bmat('a,b;b,a')
4. 矩阵与向量乘法、逆矩阵、矩阵连乘
1 A = np.mat('1,2,4;2,5,3;7,8,9') 2 x = np.array([[1], [2], [3]]) 3 A * x #矩阵与向量乘法 4 print(A * A.I) #A.I表示矩阵A的逆矩阵 5 print A ** 4 #矩阵指数表示矩阵连乘