否定Python中矩阵对角线的所有其他项的最佳方法

时间:2018-11-26 22:55:14

标签: python numpy

我想创建一个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

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

3 个答案:

答案 0 :(得分:3)

我是这样认为的。由于矩阵是正方形,因此您可以对行和列使用相同的索引列表。

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.]])

答案 1 :(得分:2)

只需使用np.diag

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

答案 2 :(得分:2)

尝试一下

from itertools import cycle, islice
import numpy as np

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