Search code examples
pythonarraysnumpymatrixdiagonal

How to diagonally populate a matrix using numpy diagonal


Suppose I have:

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]])

And the empty matrix:

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

I want to populate matrix with each element within arr1, but diagonally. This is the expected output:

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]])

This is what I have tried so far without succeeding:

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

This is the output I have from the above code:

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]])

Solution

  • Try:

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

    Prints:

    [[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]]