在Python中,求反矩阵对角线的所有其他项的最佳方法



我想创建一个numpy矩阵,它是所有其他对角线项都取反的恒等式。几个选项是:

丑陋:

n = 10
i_star = np.eye(n)
for i in range(n):
if i % 2 == 1:
i_star[i,i] *= -1   

稍好:

n = 10
i_star = np.eye(n)
i_star = i_star[[np.arange(1,n,2)],[np.arange(1,n,2)]] *= -1

有没有更优雅的解决方案?

只需使用np.diag:

np.diag([1,-1]*5)

我想是的。由于矩阵是正方形的,所以可以对行和列使用相同的索引列表。

idx = np.arange(1,n,2) 
i_star[idx,idx] = -1

更短,使用np.r_:

i_star[np.r_[1:n:2], np.r_[1:n:2]] = -1

print(i_star)
array([[ 1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0., -1.,  0.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0., -1.,  0.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0., -1.,  0.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  1.,  0.],
[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0., -1.]])

试试这个

from itertools import cycle, islice
import numpy as np
i_star = np.diag(list(islice(cycle([1, -1]), 10)))

相关内容