簡體   English   中英

如何在 python 中制作矩陣?

[英]how to make a matrix in python?

大家好我想制作一個看起來像圖像的矩陣,我首先做的是創建一個零矩陣然后用 for 我制作了矩陣的對角線但現在我需要制作上方和下方的對角線-2 但在那些沒有單一值的情況下,那些有零和一,所以我不太清楚如何制作它們。

嘗試用這段代碼制作它們在此處輸入圖像描述

N=3
D2=np.zeros((N**2,N**2))
for i in range(N**2):
  for j in range(N**2):
    if i==j:
      D2[i,j]=-2 
    elif np.abs(i-j)==1:
      D2[i,j]=1

你有幾個選擇....

  1. 您可以通過鍵入行來“手動堵塞”整個內容。 (您可能已經知道這一點。)

    D = [[-2, 1, 0, ...], [...]]

  2. 您可以創建一個較小的矩陣來表示紅色虛線框(子矩陣)中的內容,然后只需用 D 中的適當范圍覆蓋它們來替換D中的值(您可以做一個小循環以通過步進 3 來點擊正確的索引進行替換...)(未顯示):


In [30]: D
Out[30]: 
array([[0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0.]])

In [31]: temp = [[-2, 1, 0],
    ...:         [1, -2, 1],
    ...:         [0, 1, -2]]

In [32]: D[0:3,0:3] = temp

In [33]: D
Out[33]: 
array([[-2.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.]])
  1. 您可以在零落點處尋找模式並增加循環。 在這種情況下,每個零位置總共從前一個零移動 6 次(3 個超過,3 個向下),因此如果我們可以錨定第一個零,我們可以使用模運算符將所有其他出現的 6 歸零移開。 第一個零距離 (2,3) 處的原點移動 5(或等價於 (3, 2),因此:

In [34]: D = np.zeros((n,n))

In [35]: for i in range(n):
    ...:   for j in range(n):
    ...:     if i==j:
    ...:       D[i,j]=-2
    ...:     elif np.abs(i-j)==1:
    ...:       if (i+j-5) % 6 == 0:
    ...:           D[i,j]=0
    ...:       else:
    ...:           D[i,j]=1
    ...: 

In [36]: D
Out[36]: 
array([[-2.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 1., -2.,  1.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  1., -2.,  0.,  0.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0., -2.,  1.,  0.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  1., -2.,  1.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  1., -2.,  0.,  0.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0., -2.,  1.,  0.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  1., -2.,  1.],
       [ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  1., -2.]])

一種方法是從對角線構建它。 簡答

m=np.roll(np.diag(([1]*(N-1)+[0])*N), 1)-np.identity(N**2)
m+m.T

解釋

np.diag(([1]*(N-1)+[0])*N)

array([[1, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 1, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

如果你滾動它 1(向右)

np.roll(np.diag(([1]*(N-1)+[0])*N), 1)
array([[0, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 1, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 1, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 1, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 0, 0, 0, 0, 0, 0]])

如果我們從中刪除身份

m=np.roll(np.diag(([1]*(N-1)+[0])*N), 1)-np.identity(N**2)
m
array([[-1,  1,  0,  0,  0,  0,  0,  0,  0],
       [ 0, -1,  1,  0,  0,  0,  0,  0,  0],
       [ 0,  0, -1,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, -1,  1,  0,  0,  0,  0],
       [ 0,  0,  0,  0, -1,  1,  0,  0,  0],
       [ 0,  0,  0,  0,  0, -1,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0, -1,  1,  0],
       [ 0,  0,  0,  0,  0,  0,  0, -1,  1],
       [ 0,  0,  0,  0,  0,  0,  0,  0, -1]])

我們已經中途了。 我們需要雙對角線,並添加對稱的。 我們可以輕松做到

m+m.T
array([[-2,  1,  0,  0,  0,  0,  0,  0,  0],
       [ 1, -2,  1,  0,  0,  0,  0,  0,  0],
       [ 0,  1, -2,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, -2,  1,  0,  0,  0,  0],
       [ 0,  0,  0,  1, -2,  1,  0,  0,  0],
       [ 0,  0,  0,  0,  1, -2,  0,  0,  0],
       [ 0,  0,  0,  0,  0,  0, -2,  1,  0],
       [ 0,  0,  0,  0,  0,  0,  1, -2,  1],
       [ 0,  0,  0,  0,  0,  0,  0,  1, -2]])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM