可以通过下标序列来访问numpy的数组a中的片段:a[[i,j]]表示a[i]和a[j],a[:]表示所有元素,a[i:j]表示从a[i]开始直至a[j-1]为止的元素,a[:j]表示从a[0]开始直至a[j-1]为止的元素,a[i:]表示从a[i]开始后的所有元素。
对于表示矩阵的2-维数组A,A[i,j]表示第i行第j列元素。其中,列标可缺省,意为所有列,行标不可缺省。A[i,:],或A[i]表示第i行元素,A[i:j]表示从第i行A[i]开始到第j-1行A[j-1]为止的各行,A[[i,j]]表示第i行A[i]和第j行A[j]。A[:,j]表示第j列元素,A[:,i:j]表示从第i列到第j-1列为止的各列,A[:,[i,j]]表示第i列A[:,i]和第j列A[:,j]。A[i:j,p:q]表示“块”第i行到第j-1行,第p列到第q-1列,如下图所示。
可以用下标序列的方法读取表示矩阵的2-维数组中的“块”,numpy还提供了两个将“小”矩阵粘结成“大”矩阵的函数hstack和vstack。前者将对干个行数相等的矩阵横向连接,其调用接口为
hstack((A,B,...))
\text{hstack((A,B,...))}
hstack((A,B,...))
后者对若干个列数相同的矩阵纵向连接,调用接口为
vstack((A,B,...)).
\text{vstack((A,B,...)).}
vstack((A,B,...)).
例1 下列代码将矩阵
A
=
(
1
0
0
0
0
1
0
0
−
1
2
1
0
1
1
0
1
)
\boldsymbol{A}=\begin{pmatrix}1&0&0&0\\0&1&0&0\\-1&2&1&0\\1&1&0&1\end{pmatrix}
A=⎝⎜⎜⎛10−11012100100001⎠⎟⎟⎞分成
4
4
4个
2
×
2
2\times2
2×2小块:
A
=
(
I
O
A
1
I
)
,
\boldsymbol{A}=\begin{pmatrix}\boldsymbol{I}&\boldsymbol{O}\\\boldsymbol{A}_1&\boldsymbol{I}\end{pmatrix},
A=(IA1OI),
然后将它们粘合成
B
=
(
A
1
I
I
O
)
=
(
−
1
2
1
0
1
1
0
1
1
0
0
0
0
1
0
0
)
.
\boldsymbol{B}=\begin{pmatrix}\boldsymbol{A}_1&\boldsymbol{I}\\\boldsymbol{I}&\boldsymbol{O}\end{pmatrix}=\begin{pmatrix}-1&2&1&0\\1&1&0&1\\1&0&0&0\\0&1&0&0\end{pmatrix}.
B=(A1IIO)=⎝⎜⎜⎛−1110210110000100⎠⎟⎟⎞.
python">import numpy as np #导入numpy
A=np.array([[1,0,0,0], #设置矩阵
[0,1,0,0],
[-1,2,1,0],
[1,1,0,1]])
I=A[:2,:2] #左上角块
O=A[:2,2:] #右上角块
A1=A[2:,:2] #左下角块
B=np.vstack((np.hstack((A1,I)), #连接
np.hstack((I,O))))
print(B)
利用代码内部的注释信息,不难理解该程序。运行输出
python">[[-1 2 1 0]
[ 1 1 0 1]
[ 1 0 0 0]
[ 0 1 0 0]]
写博不易,敬请支持:
如果阅读本文于您有所获,敬请点赞、评论、收藏,谢谢大家的支持!