如何使用numpy diagonal对角填充矩阵

hpcdzsge  于 2022-11-24  发布在  Go
关注(0)|答案(2)|浏览(187)

假设我有:
arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
还有空矩阵:

matrix = np.zeros((10, 10))
matrix[:] = np.NaN

我想用arr1中的每个元素填充matrix,但要对角填充。

array([[ nan, nan, nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 1,   nan, nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 6,   2,   nan,  nan,  nan, nan, nan, nan, nan, nan],
       [ 11,  7,   3,    nan,  nan, nan, nan, nan, nan, nan],
       [ 16,  12,  8,    4,    nan, nan, nan, nan, nan, nan],
       [ 21,  17,  13,   9,    5,   nan, nan, nan, nan, nan],
       [ nan, 22,  18,   14,   10,  nan, nan, nan, nan, nan],
       [ nan, nan, 23,   19,   15,  nan, nan, nan, nan, nan],
       [ nan, nan, nan,  24,   20,  nan, nan, nan, nan, nan],
       [ nan, nan,  nan, nan,  25,  nan, nan, nan, nan, nan]])

这就是我迄今为止尝试过但没有成功的:

arr1 = np.array([[1,2,3,4,5], [6,7,8,9,10], [11,12,13,14,15], [16,17,18,19,20], [21,22,23,24,25]])
matrix = np.zeros((10, 10))
matrix[:] = np.NaN

for i, array in enumerate(arr1):                                 
    for row_matrix in matrix:
        row_matrix = np.diag(array, -i-1)
        break

下面是上面代码的输出:

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],
       [ 21, 0,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0, 22,  0,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0, 23,  0,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0, 24,  0,  0,  0,  0,  0,  0],
       [ 0,  0,  0,  0, 25,  0,  0,  0,  0,  0]])
svmlkihl

svmlkihl1#

请尝试:

for i, col in enumerate(arr1.T, 1):
    matrix[i : i + len(col), i - 1] = col

print(matrix)

印刷品:

[[nan nan nan nan nan nan nan nan nan nan]
 [ 1. nan nan nan nan nan nan nan nan nan]
 [ 6.  2. nan nan nan nan nan nan nan nan]
 [11.  7.  3. nan nan nan nan nan nan nan]
 [16. 12.  8.  4. nan nan nan nan nan nan]
 [21. 17. 13.  9.  5. nan nan nan nan nan]
 [nan 22. 18. 14. 10. nan nan nan nan nan]
 [nan nan 23. 19. 15. nan nan nan nan nan]
 [nan nan nan 24. 20. nan nan nan nan nan]
 [nan nan nan nan 25. nan nan nan nan nan]]
70gysomp

70gysomp2#

无任何迭代

n=len(arr1)
arr2=np.full((2*n, 2*n+1), np.nan)
arr2[:n,1:n+1]=arr1.T
arr2.resize((2*n,2*n))
matrix=arr2.T

只要利用一个事实,即有n个值,n+1之间的nan,当你读“从左到右,逐行”转置想要的结果。所以,好吧,我们简单地在一个10 x11矩阵中做,其中,当复制时,arr 1的值具有完全相同的属性(每行5个值,然后6个nan)。因此,在调整到10 x10之后,这5个值然后6个nan意味着移位)。
所以,一切都是关于复制数据在1列太大的矩阵,然后调整它的大小。加上一些转置发挥。

计时

对于5x 5示例
| 检查方法|时间|
| - -|- -|
| 你的|35.3微秒|
| 安德烈的|15.7微秒|
| 这个|9.1微秒|
在5000 x5000示例上
| 检查方法|时间|
| - -|- -|
| 你的|七十点二四秒|
| 安德烈的|0.54秒|
| 这个|0.31秒|

相关问题