第NumPy个第k个对角线索引

问题描述 投票:16回答:5

我想用numpy.array的第k个对角线进行算术运算。我需要那些索引。例如,类似:

>>> a = numpy.eye(2)
>>> a[numpy.diag_indices(a, k=-1)] = 5
>>> a
array([[ 1.,  0.],
       [ 5.,  1.]])

不幸的是,diag_indices只返回包含主对角线的索引,所以我现在正在这样做:

a += numpy.diag([5], -1)

但是这看起来并不好或不可靠。 :-)

numpy中是否有办法获取除主对角线以外的索引?

python numpy indices diagonal
5个回答
14
投票
有点晚,但是此版本也适用于k = 0(并且不会更改数组,因此不需要进行复制)。

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


8
投票
这是一种方式:

    创建索引值数组。
  1. 获取所需的每日索引值。
  2. 就这样! :)
  • 喜欢这个:

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


  • 4
    投票
    a的第

    k个对角线的索引可以用

    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]
    演示:

    >>> 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
    投票
    还有另一种解决方案。用np.eye创建一个矩阵E。您可以像下面这样更改主对角线。然后,再创建两个带有k参数的矩阵。最后,只需将所有矩阵合并在一起即可。

    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)


    -1
    投票
    使用numpy.diag(v, k=0)

    Where

    k设置从中心开始的对角线位置。

    即{k=0:“默认中心”,k=(-1):“中心左侧1行”,k=1:“中心右侧1行}

    然后按照通常的期望进行算术。

    在此处签出文档:np.diag()

    示例:

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

    © www.soinside.com 2019 - 2024. All rights reserved.