如何在numpy中创建一个反对角线矩阵(对角线从右上至左下)

5
我该如何在numpy中创建反对角矩阵?我肯定可以手动完成,但如果有函数的话,我很好奇它是什么。我正在寻找一个矩阵,其中从左下到右上的位置填充1,其他所有位置都填充0。

@jpp 谢谢,但是应该从左下角到右上角为1,其他地方都是0。 - user1700890
4
这句话的意思是“那么 np.eye(5)[::-1] 呢?我不确定有什么比这更好的了。”其中,np.eye(5)[::-1] 是一个Python代码片段,它的作用是创建一个5x5的矩阵,对角线上的元素为1,其他元素为0,并将该矩阵上下翻转。 - jpp
2个回答

7
使用np.eye(n)[::-1]可以得到以下结果:
array([[ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.]])

对于 n=5


2
一种方法是翻转矩阵,计算对角线,然后再次翻转它。
在numpy中,np.diag()函数可以从矩阵中提取对角线,或者从数组构建对角线矩阵。您可以使用两次来获取对角线矩阵。
因此,您会得到类似于这样的东西:
import numpy as np
a = np.arange(25).reshape(5,5)
>>> a
[[ 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]]
b = np.fliplr(np.diag(np.diag(np.fliplr(a))))
>>> b
[[ 0  0  0  0  4]
 [ 0  0  0  8  0]
 [ 0  0 12  0  0]
 [ 0 16  0  0  0]
 [20  0  0  0  0]]

我不确定做这一切的效率会有多高。
这将生成一个反对角矩阵,而不是标识矩阵的翻转版本。
如果你想要标识矩阵的翻转版本,你可以简单地在`np.eye(n)`的输出上调用np.fliplr()。例如:
>>> np.fliplr(np.eye(5))
array([[ 0.,  0.,  0.,  0.,  1.],
       [ 0.,  0.,  0.,  1.,  0.],
       [ 0.,  0.,  1.,  0.,  0.],
       [ 0.,  1.,  0.,  0.,  0.],
       [ 1.,  0.,  0.,  0.,  0.]])

我会将这个留给那些可能需要在numpy中使用反对角矩阵的人,但是@jpp回答了实际被问到的问题。 - Grant Williams
你可以简单地使用 np.fliplr(np.eye(n)) 来回答这个问题。 - pault
1
@pault 嗯,那是一个翻转的单位矩阵。在 OP 编辑问题之前,原始问题是如何制作一个反对角线矩阵。反对角线矩阵并不保证沿对角线为 1,所以我把我的留下来供后人参考。 - Grant Williams
1
@pault 嗯,它是一个反对角矩阵,但它只是一个子集。翻转的单位矩阵是单位矩阵的反对角矩阵,而我最初提供的解决方案适用于任何可能已经是对角矩阵或非对角矩阵的矩阵。 - Grant Williams

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