用Python替换二维数组的对角线

5

I have the following 2D array

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"的对角线2D数组。

是否有一种方法可以使用numpy实现这个功能? 上面的例子是最简单的例子。我想要能够改变不仅主对角线,而且所有对角线。

2个回答

5
您可以使用 np.fill_diagonal(..) 进行此操作。如文档所述:

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

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

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

我们在这里通过整个对角线进行广播 broadcast 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.]])

如果需要更改其他对角线,那么就需要将数组镜像。例如针对反对角线,我们可以使用以下代码:

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) 条对角线。我们可以通过镜像一个或多个维度来分配它们。


1
我喜欢你的回答(发现numpy函数是可爱的),但他要求主对角线,如果我没记错的话,还有任何对角线。 - IMCoins
谢谢,这是一个好答案。我已经改变了数组“a”,因为它是一个所有元素都等于20的坏例子。 - DiegoDZ
@IMCoins:这只填充了对角线(甚至在文档中都有说明):) - Willem Van Onsem
@DiegoDZ:那不是问题,你也可以传递一个可迭代对象,这样它将不会执行广播。 - Willem Van Onsem

3

请查看numpy文档,了解如何索引多维数组。

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]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接