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

在Python中,对矩阵对角线的其他每一项求反的最佳方法,python,numpy,Python,Numpy,我想创建一个numpy矩阵,它是所有其他对角线项都被否定的恒等式。以下是一些选择: 丑陋的: 稍微好一点: n = 10 i_star = np.eye(n) i_star = i_star[[np.arange(1,n,2)],[np.arange(1,n,2)]] *= -1 有更优雅的解决方案吗?我想是的。因为矩阵是正方形的,所以可以对行和列使用相同的索引列表 idx = np.arange(1,n,2) i_star[idx,idx] = -1 甚至更短,使用np.r\: i_s

我想创建一个numpy矩阵,它是所有其他对角线项都被否定的恒等式。以下是一些选择:

丑陋的:

稍微好一点:

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

有更优雅的解决方案吗?

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

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


只需使用
np.diag

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

from itertools import cycle, islice
import numpy as np

i_star = np.diag(list(islice(cycle([1, -1]), 10)))

这能让你创建一个9x9矩阵吗?好吧,你可以把你喜欢的任何东西放在参数中,
[1,-1]*4+[1]
,如果你愿意的话……是的,但是理想的解决方案不会有n是偶数对奇数的特殊情况。否则,这似乎是最优雅的解决方案。那么@LakshayGarg的解决方案可能就是您的改进after@Julien那么np.diag(([1,-1]*n)[:n])呢?肯定是一个改进,但是界限偏离了1。我相信应该是np.arange(1,n,2)。@JamesShapiro谢谢,谢谢。
np.diag([1,-1]*5)
from itertools import cycle, islice
import numpy as np

i_star = np.diag(list(islice(cycle([1, -1]), 10)))