如何在 numpy 中创建反对角单位矩阵(其中对角线从左向右翻转)
How to create an anti-diagonal identity matrix (where the diagonal is flipped left to right) in numpy
如何在 numpy 中创建反对角矩阵?我当然可以手动完成,但很好奇是否有它的功能。
我正在寻找一个矩阵,其中的矩阵从左下角到右上角,其他地方都为零。
一种方法是翻转矩阵,计算对角线,然后再翻转一次。
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.]])
使用 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
如何在 numpy 中创建反对角矩阵?我当然可以手动完成,但很好奇是否有它的功能。
我正在寻找一个矩阵,其中的矩阵从左下角到右上角,其他地方都为零。
一种方法是翻转矩阵,计算对角线,然后再翻转一次。
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.]])
使用 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