[英]Creating an identity Matrix containing diagonally determined values
本質上,我正在尋找一段高效的代碼來生成以下矩陣:
[[1 2 3 4 5]
[2 3 4 5 6]
[3 4 5 6 7]
[4 5 6 7 8]
[5 6 7 8 9]]
我提出了以下可行的方法,但是它並不是特別漂亮,並且我認為可能有一種方法可以真正利用numpy
來實現(除了創建矩陣並漂亮地打印出來):
import copy
import numpy as np
identity_count = 5
priority_matrix = np.identity(identity_count, dtype=int)
rating_start = 1
maximum_rating = identity_count * 2
rating_range = range(rating_start, maximum_rating)
priority_copy = copy.copy(priority_matrix)
for row_idx, row in enumerate(priority_copy):
rating_pos = 0
for col_idx, item in enumerate(row):
priority_matrix[row_idx][col_idx] = rating_range[rating_pos]
rating_pos += 1
rating_start += 1
rating_range = range(rating_start, maximum_rating)
print(np.matrix(priority_matrix))
必須有一種更有效的方法來執行此操作(不必與numpy
一起使用)。
謝謝!
您顯然正在描述一種Hankel矩陣 。
>>> from scipy.linalg import hankel
>>> hankel(c=range(1,6), r=range(5,10))
array([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9]])
漢克矩陣具有恆定的反對角線。 參數c
和r
指定第一列和最后一行 。
這是使用NumPy strides
的方法-
a = np.arange(1,10)
W = 5 # Row length / Window size
nrows = a.size - W + 1
n = a.strides[0]
out = np.lib.stride_tricks.as_strided(a,shape=(nrows,W),strides=(n,n))
broadcasting
另一種方式-
np.arange(10-W)[:,None] + np.arange(1,W+1)
您可以通過簡單的單列代碼列表實現。 恐怕我不知道特定於numpy
方式,但是之后總是可以轉換為數組。
matrix = [[x for x in range(y,y+5)] for y in range(1,6)]
只是拋出另一個基於numpy的選項:
In [21]: np.arange(1,26).reshape(5,5) - np.arange(0, 20, 4)[np.newaxis].T
Out[21]:
array([[1, 2, 3, 4, 5],
[2, 3, 4, 5, 6],
[3, 4, 5, 6, 7],
[4, 5, 6, 7, 8],
[5, 6, 7, 8, 9]])
或概括為任意大小:
In [29]: N = 10
In [30]: np.arange(N**2).reshape(N,N) - np.arange(0, N*(N-1), N-1)[np.newaxis].T + 1
Out[30]:
array([[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
[ 2, 3, 4, 5, 6, 7, 8, 9, 10, 11],
[ 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
[ 4, 5, 6, 7, 8, 9, 10, 11, 12, 13],
[ 5, 6, 7, 8, 9, 10, 11, 12, 13, 14],
[ 6, 7, 8, 9, 10, 11, 12, 13, 14, 15],
[ 7, 8, 9, 10, 11, 12, 13, 14, 15, 16],
[ 8, 9, 10, 11, 12, 13, 14, 15, 16, 17],
[ 9, 10, 11, 12, 13, 14, 15, 16, 17, 18],
[10, 11, 12, 13, 14, 15, 16, 17, 18, 19]])
這個怎么樣? 使用map
和np.vstack
N = 5
x = np.arange(1,2*N)
np.vstack(map(lambda i: np.roll(x, -i), range(N)))[:,0:N]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.