矩阵转一维后的坐标和索引对应关系及应用
Table of Contents
问题背景
将一个\(m*n\)的数组(矩阵)转换成一维向量时,数组\((i,j)\)和向量(\(ind\))中元素下标的对应关系:\(ind=j*n+j\)。
import numpy as np
#先创建一个矩阵
M=np.random.random((5,4))
m,n=M.shape#大小(形状)
M
array([[0.62661689, 0.97475636, 0.68059702, 0.54521865],
[0.22265707, 0.59720758, 0.26348054, 0.90752628],
[0.57090417, 0.70450636, 0.48227928, 0.09282049],
[0.92947388, 0.87650403, 0.94245358, 0.46289981],
[0.44685817, 0.84783673, 0.59687681, 0.7511728 ]])
#转成一维向量
M.reshape((1,-1))[0]#下标范围0~19,19=m*n-1
array([0.62661689, 0.97475636, 0.68059702, 0.54521865, 0.22265707,
0.59720758, 0.26348054, 0.90752628, 0.57090417, 0.70450636,
0.48227928, 0.09282049, 0.92947388, 0.87650403, 0.94245358,
0.46289981, 0.44685817, 0.84783673, 0.59687681, 0.7511728 ])
#矩阵的下标
res=[]
for i in range(m):
temp=[]
for j in range(n):
temp.append((i,j))
res.append(temp)
res
[[(0, 0), (0, 1), (0, 2), (0, 3)],
[(1, 0), (1, 1), (1, 2), (1, 3)],
[(2, 0), (2, 1), (2, 2), (2, 3)],
[(3, 0), (3, 1), (3, 2), (3, 3)],
[(4, 0), (4, 1), (4, 2), (4, 3)]]
研究矩阵和向量下标的关系即寻找一种映射使得矩阵的坐标和向量的下标(索引)对应即可
#解决方法
for i in range(m):
for j in range(n):
print(i*n+j,end=" ")
"""
核心思路:
(1)每一行时,只关注列,即j;
(2)第i行到第i+行时,向量索引(ind)增加了n(矩阵列的个数)个
"""
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
应用场景
这应该是高等代数中的内容,好久不用忘记了。这几天在使用matplotlib画图时,发现用它来进行subplots的布局,贼爽!部分代码展示如下:
def MakePlot(tempdata):
......
# 开始画图
fig, axes = plt.subplots(
ncols=1, nrows=m*n, figsize=figsize, sharex=True) # 矩阵的大小
# 设置背景
plt.style.use('ggplot')
# 设置标题
plt.suptitle("title", fontsize=20)
Axes = axes.flatten() # 转成一维
# 设置X轴的范围
plt.xlim(0,10)
"""
本来的布局结构是:(m,n)---->>>可使用axes[i,j]即可。因实际需要,要共用x轴,所以要把它转成一列。
现在的布局结构是一列,
应用:将矩阵转换成一维向量,索引位置:i*vars_len+i+j
"""
for i in range(m):
for j in range(n):
Axes[i*n+j].plot(.......)
.......