【问题标题】:Replace diagonals of a 2D array with python [duplicate]用python替换二维数组的对角线[重复]
【发布时间】:2018-02-01 18:19:39
【问题描述】:

我有以下二维数组

A=([[1, 2, 3, 4],
    [5, 6, 7, 8],
    [9, 10, 11, 12],
    [13, 14, 15, 16])

我想用数组替换主对角线

a = ([0,2,15,20])

因此,结果一定是

A=([[0, 2, 3, 4],
    [5, 2, 7, 8],
    [9, 10, 15, 12],
    [13, 14, 15, 20])

我尝试使用 np.diag(a, k=0) 但它不起作用,因为 np.diag() 使用数组“a”创建了一个对角二维数组。

有没有办法用 numpy 做到这一点? 上面的例子是最简单的。我希望不仅可以更改邮件对角线,还可以更改所有对角线。

【问题讨论】:

    标签: python arrays numpy diagonal


    【解决方案1】:

    您可以为此使用np.fill_diagonal(..)。就像文档说的:

    numpy.fill_diagonal(a, val, wrap=False)

    填充给定任意维度数组的主对角线。

    例如:

    np.<b>fill_diagonal</b>(A, 20)

    因此,我们在这里广播 20 在整个对角线上。

    您还可以用不同的值填充对角线,例如:

    np.fill_diagonal(A, [0,2,15,20])

    例如:

    >>> a = np.zeros((4,4))
    >>> np.fill_diagonal(a, [0,2,15,20])
    >>> a
    array([[ 0.,  0.,  0.,  0.],
           [ 0.,  2.,  0.,  0.],
           [ 0.,  0., 15.,  0.],
           [ 0.,  0.,  0., 20.]])
    

    如果您想更改其他对角线,则只需镜像阵列即可。例如对于 antidiagonal,我们可以使用:

    np.fill_diagonal(A<b>[::-1]</b>, -20)

    于是我们得到:

    >>> A = np.zeros((4,4))
    >>> np.fill_diagonal(A[::-1], -20)
    >>> A
    array([[  0.,   0.,   0., -20.],
           [  0.,   0., -20.,   0.],
           [  0., -20.,   0.,   0.],
           [-20.,   0.,   0.,   0.]])
    

    如果我们不考虑上对角线下对角线,一个n维矩阵有n×(n-1 ) 对角线。我们可以通过镜像一个或多个维度来分配它。

    【讨论】:

    • 我喜欢你的回答(发现 numpy 函数很可爱),但他要求主对角线,如果我没记错的话,只要 any 对角线。
    • 谢谢,这是一个很好的答案。我更改了数组“a”,因为它是一个糟糕的例子,所有元素都等于 20。
    • @IMCoins:好吧,这只填充了 main 对角线(甚至在文档中):)
    • @DiegoDZ:这不是问题,你也可以传递一个iterable,然后它将执行广播。
    【解决方案2】:

    查看numpy docs 对多维数组的索引。

    A[np.arange(A.shape[0]), np.arange(A.shape[1])] = [0,2,15,20]
    

    注意:@WillemVanOnsem 的答案是填充主对角线的最佳答案,但这是获取/设置多维数组中任何元素子集的最佳通用方法!

    例如改变另一个对角线:

    A[-np.arange(1, A.shape[0] + 1), np.arange(A.shape[1])] = [0,2,15,20]
    

    【讨论】:

      猜你喜欢
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-14
      • 2011-02-21
      相关资源
      最近更新 更多