Getting diagonal matrix stripe automatically in numpy or pytorch

后端 未结 2 1846
甜味超标
甜味超标 2021-01-14 10:11

I need to get a diagonal stripe of the matrix (not sure about the terminology here, diagonal matrix stripe seems to describe it best).

Say, I have a matrix of size K

2条回答
  •  有刺的猬
    2021-01-14 10:37

    stride_tricks do the trick:

    >>> import numpy as np
    >>> 
    >>> def stripe(a):
    ...    a = np.asanyarray(a)
    ...    *sh, i, j = a.shape
    ...    assert i >= j
    ...    *st, k, m = a.strides
    ...    return np.lib.stride_tricks.as_strided(a, (*sh, i-j+1, j), (*st, k, k+m))
    ... 
    >>> a = np.arange(24).reshape(6, 4)
    >>> 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]])
    >>> stripe(a)
    array([[ 0,  5, 10, 15],
           [ 4,  9, 14, 19],
           [ 8, 13, 18, 23]])
    

    If a is an array this creates a writable view, meaning that if you feel so inclined you can do things like

    >>> stripe(a)[...] *= 10
    >>> a
    array([[  0,   1,   2,   3],
           [ 40,  50,   6,   7],
           [ 80,  90, 100,  11],
           [ 12, 130, 140, 150],
           [ 16,  17, 180, 190],
           [ 20,  21,  22, 230]])
    

    UPDATE: bottom-left to top-right stripes can be obtained in the same spirit. Only minor complication: It is not based at the same address as the original array.

    >>> def reverse_stripe(a):
    ...     a = np.asanyarray(a)
    ...     *sh, i, j = a.shape
    ...     assert i >= j
    ...     *st, k, m = a.strides
    ...     return np.lib.stride_tricks.as_strided(a[..., j-1:, :], (*sh, i-j+1, j), (*st, k, m-k))
    ... 
    >>> a = np.arange(24).reshape(6, 4)
    >>> reverse_stripe(a)
    array([[12,  9,  6,  3],
           [16, 13, 10,  7],
           [20, 17, 14, 11]])
    

提交回复
热议问题