1. 程式人生 > 實用技巧 >矩陣轉一維後的座標和索引對應關係及應用

矩陣轉一維後的座標和索引對應關係及應用

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(.......)
    .......