Fill matrix diagonal with different values for each python numpy

后端 未结 2 1667
南旧
南旧 2021-01-12 19:48

I saw a function numpy.fill_diagonal which assigns same value for diagonal elements. But I want to assign different random values for each diagonal elements. Ho

相关标签:
2条回答
  • 2021-01-12 20:39

    You can use np.diag_indices to get those indices and then simply index into the array with those and assign values.

    Here's a sample run to illustrate it -

    In [86]: arr          # Input array
    Out[86]: 
    array([[13, 69, 35, 98, 16],
           [93, 42, 72, 51, 65],
           [51, 33, 96, 43, 53],
           [15, 26, 16, 17, 52],
           [31, 54, 29, 95, 80]])
    
    # Get row, col indices
    In [87]: row,col = np.diag_indices(arr.shape[0])
    
    # Assign values, let's say from an array to illustrate
    In [88]: arr[row,col] = np.array([100,200,300,400,500])
    
    In [89]: arr
    Out[89]: 
    array([[100,  69,  35,  98,  16],
           [ 93, 200,  72,  51,  65],
           [ 51,  33, 300,  43,  53],
           [ 15,  26,  16, 400,  52],
           [ 31,  54,  29,  95, 500]])
    

    You can also use np.diag_indices_from and probably would be more idomatic, like so -

    row, col = np.diag_indices_from(arr)
    

    Note : The tried function would work just fine. This is discussed in a previous Q&A - Numpy modify ndarray diagonal too.

    0 讨论(0)
  • 2021-01-12 20:40

    That the docs call the fill val a scalar is an existing documentation bug. In fact, any value that can be broadcasted here is OK.

    Fill diagonal works fine with array-likes:

    >>> a = np.arange(1,10).reshape(3,3)
    >>> a
    array([[1, 2, 3],
           [4, 5, 6],
           [7, 8, 9]])
    >>> np.fill_diagonal(a, [99, 42, 69])
    >>> a
    array([[99,  2,  3],
           [ 4, 42,  6],
           [ 7,  8, 69]])
    

    It's a stride trick, since the diagonal elements are regularly spaced by the array's width + 1.

    From the docstring, that's a better implementation than using np.diag_indices too:

    Notes
    -----
    .. versionadded:: 1.4.0
    
    This functionality can be obtained via `diag_indices`, but internally
    this version uses a much faster implementation that never constructs the
    indices and uses simple slicing.
    
    0 讨论(0)
提交回复
热议问题