NumPy k-th diagonal indices

后端 未结 5 605
青春惊慌失措
青春惊慌失措 2020-12-28 17:00

I\'d like to do arithmetics with k-th diagonal of a numpy.array. I need those indices. For example, something like:

>>> a = numpy.eye(2)
>>>         


        
相关标签:
5条回答
  • 2020-12-28 17:07

    A bit late, but this version also works for k = 0 (and does not alter the arrays, so does not need to make a copy).

    def kth_diag_indices(a, k):
        rows, cols = np.diag_indices_from(a)
        if k < 0:
            return rows[-k:], cols[:k]
        elif k > 0:
            return rows[:-k], cols[k:]
        else:
            return rows, cols
    
    0 讨论(0)
  • 2020-12-28 17:09

    Here's a way:

    1. Create index value arrays.
    2. Get the daigonal index values you want.
    3. Thats it! :)

    Like this:

    >>> import numpy as np
    >>> rows, cols = np.indices((3,3))
    >>> row_vals = np.diag(rows, k=-1)
    >>> col_vals = np.diag(cols, k=-1)
    >>> z = np.zeros((3,3))
    >>> z[row_vals, col_vals]=1
    >>> z
    array([[ 0.,  0.,  0.],
           [ 1.,  0.,  0.],
           [ 0.,  1.,  0.]])
    
    0 讨论(0)
  • 2020-12-28 17:11

    There is another solution. Create a matrix E with np.eye. You can just change the main diagonal like the following. Then, create two more matrizes with the k parameter in eye. In the end just add all matrizes together.

    E = np.eye(5)
    E = E*2
    F = -1*np.eye(len(E),k=1)
    G = -1*np.eye(len(E),k=-1)
    
    E = E+F+G
    print(E)
    
    0 讨论(0)
  • 2020-12-28 17:24

    The indices of the k'th diagonal of a can be computed with

    def kth_diag_indices(a, k):
        rowidx, colidx = np.diag_indices_from(a)
        colidx = colidx.copy()  # rowidx and colidx share the same buffer
    
        if k > 0:
            colidx += k
        else:
            rowidx -= k
        k = np.abs(k)
    
        return rowidx[:-k], colidx[:-k]
    

    Demo:

    >>> a
    array([[ 0,  1,  2,  3,  4],
           [ 5,  6,  7,  8,  9],
           [10, 11, 12, 13, 14],
           [15, 16, 17, 18, 19],
           [20, 21, 22, 23, 24]])
    >>> a[kth_diag_indices(a, 1)]
    array([ 1,  7, 13, 19])
    >>> a[kth_diag_indices(a, 2)]
    array([ 2,  8, 14])
    >>> a[kth_diag_indices(a, -1)]
    array([ 5, 11, 17, 23])
    
    0 讨论(0)
  • 2020-12-28 17:30

    Use numpy.diag(v, k=0)

    Where k sets the diagonal location from center.

    ie. {k=0: "default center", k=(-1): "1 row to the left of center", k=1: "1 row to the right of center}

    Then perform the arithmetic as you would normally expect.

    Check out the docs here: np.diag().

    Examples:

    In [3]: np.diag(np.arange(6), k=0)
    Out[3]: 
    array([[0, 0, 0, 0, 0, 0],
           [0, 1, 0, 0, 0, 0],
           [0, 0, 2, 0, 0, 0],
           [0, 0, 0, 3, 0, 0],
           [0, 0, 0, 0, 4, 0],
           [0, 0, 0, 0, 0, 5]])
    
    In [4]: np.diag(np.arange(6), k=1)
    Out[4]: 
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 1, 0, 0, 0, 0],
           [0, 0, 0, 2, 0, 0, 0],
           [0, 0, 0, 0, 3, 0, 0],
           [0, 0, 0, 0, 0, 4, 0],
           [0, 0, 0, 0, 0, 0, 5],
           [0, 0, 0, 0, 0, 0, 0]])
    
    In [5]: np.diag(np.arange(6), k=-1)
    Out[5]: 
    array([[0, 0, 0, 0, 0, 0, 0],
           [0, 0, 0, 0, 0, 0, 0],
           [0, 1, 0, 0, 0, 0, 0],
           [0, 0, 2, 0, 0, 0, 0],
           [0, 0, 0, 3, 0, 0, 0],
           [0, 0, 0, 0, 4, 0, 0],
           [0, 0, 0, 0, 0, 5, 0]])
    
    0 讨论(0)
提交回复
热议问题