我想创建一个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
有没有更优雅的解决方案?
答案 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)))