【问题标题】:Assign shifted diagonal values with np.diag使用 np.diag 分配移位的对角线值
【发布时间】:2020-12-15 02:43:00
【问题描述】:

我正在尝试将值分配给矩阵的多个对角线。例如,我有这个矩阵:

>>> u = np.zeros(25).reshape(5, 5)
>>> u
array([[0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0.]])

我想给上面的$k$-ith 对角线赋值。例如,如果 $k=1$,我希望对角线在主对角线上方。我试图通过使用np.diag 来完成此操作,例如np.diag(u, k=1) = 1,我希望得到以下结果:

>>> u
array([[0., 1., 0., 0., 0.],
       [0., 0., 1., 0., 0.],
       [0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 1.],
       [0., 0., 0., 0., 0.]])

问题是这给了我一个SyntaxError: can't assign to function call,因为这又是Python。但是np.diag 返回一个对原始矩阵的引用,如您所见:

>>> np.may_share_memory(np.diag(u, k=1), u)
True

我该怎么做?提前谢谢你。

【问题讨论】:

  • 不管它返回什么,python 都不允许你分配给调用。那只是基本的python。

标签: python numpy numpy-ndarray diagonal


【解决方案1】:

你可以使用

u[np.eye(len(u), k=1, dtype='bool')] = 1
print(u)

输出:

[[0. 1. 0. 0. 0.]
 [0. 0. 1. 0. 0.]
 [0. 0. 0. 1. 0.]
 [0. 0. 0. 0. 1.]
 [0. 0. 0. 0. 0.]]

【讨论】:

  • 太棒了! np.fill_diagonal(u, 1, k=1) 应该是一个选项。也许我可以在 GitHub 上提出问题。你怎么看?
  • 我知道。这也是我的第一个想法。但是fill_diagonal 没有k 参数。我不认为这将是开发人员的优先事项。我的解决方案感觉像是一个 hack,也许有人会发布一个更好的方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-09-28
相关资源
最近更新 更多