numpy 使用np.diag指定移位的对角线值

mw3dktmi  于 4个月前  发布在  其他
关注(0)|答案(2)|浏览(42)

我试图给矩阵的多个对角线赋值。例如,我有这个矩阵:

>>> 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$-第i条对角线赋值。例如,如果$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,但np.diag返回了对原始矩阵的引用,正如你所看到的:

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


我该怎么做呢?先谢谢你。

wrrgggsh

wrrgggsh1#

您可以使用

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

ufj5ltwl

ufj5ltwl2#

如果我理解正确的话,你稍微误解了diag(v,k),因为它的参数是来自向量v的(次,超)对角矩阵。为了实现你想要的矩阵,你可以做以下事情:

u = np.zeros(25).reshape(5,-1)
 v = np.ones(5) # a vector v, a parameter in the diag(v,k=1)
 u = u + np.diag(v[:-1], 1) # k indicates the offset (negative being sub, positive being super)
 print(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.]])

字符串
现在你可以看到矢量v直接根据k切片,因为偏移对角线的元素较少。这个方法可以通过创建一个具有所需值的矢量并将其添加到零矩阵来给予任何你想要的偏移对角线元素。使用这个方法,我们可以改变任何偏移对角线的值。我希望这能回答你的问题,并表明我们可以对任何数字这样做通过使用full((n,m),q)创建向量或具有任何向量。

相关问题