我想用numpy.array的第k个对角线做算术。我需要那些指数。 例如,像:
>>> a = numpy.eye(2)
>>> a[numpy.diag_indices(a, k=-1)] = 5
>>> a
array([[ 1., 0.],
[ 5., 1.]])
不幸的是,diag_indices只返回包含主对角线的索引,所以在我正在做的那一刻:
a += numpy.diag([5], -1)
但这似乎不太好或不健全。 : - )
在numpy中有没有办法获得除主对角线以外的指数?
答案 0 :(得分:13)
有点晚了,但是这个版本也适用于k = 0
(并且不会改变数组,所以不需要复制)。
def kth_diag_indices(a, k):
rows, cols = np.diag_indices_from(a)
if k < 0:
return rows[-k:], cols[:k]
elif k > 0:
return rows[:-k], cols[k:]
else:
return rows, cols
答案 1 :(得分:6)
这是一种方式:
像这样:
>>> import numpy as np
>>> rows, cols = np.indices((3,3))
>>> row_vals = np.diag(rows, k=-1)
>>> col_vals = np.diag(cols, k=-1)
>>> z = np.zeros((3,3))
>>> z[row_vals, col_vals]=1
>>> z
array([[ 0., 0., 0.],
[ 1., 0., 0.],
[ 0., 1., 0.]])
答案 2 :(得分:4)
a
的 k '对角线的索引可以用
def kth_diag_indices(a, k):
rowidx, colidx = np.diag_indices_from(a)
colidx = colidx.copy() # rowidx and colidx share the same buffer
if k > 0:
colidx += k
else:
rowidx -= k
k = np.abs(k)
return rowidx[:-k], colidx[:-k]
演示:
>>> a
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14],
[15, 16, 17, 18, 19],
[20, 21, 22, 23, 24]])
>>> a[kth_diag_indices(a, 1)]
array([ 1, 7, 13, 19])
>>> a[kth_diag_indices(a, 2)]
array([ 2, 8, 14])
>>> a[kth_diag_indices(a, -1)]
array([ 5, 11, 17, 23])
答案 3 :(得分:2)
因此,由于 np.diag_indices() 没有与 np.triu_indices() 相同的功能来获取第 k 个对角线/三角形,另一种方法是仅使用 np.eye(n,k) 来构造 nxn在第 k 对角线上有 1 的矩阵,然后使用 np.where 提取 1 所在位置的索引元组。
所以我们只需:
T = np.where(np.eye(5,k=-1) == 1)
这是眼矩阵的额外分配,在某些情况下可能会过多,但它是一个简单的单行。
答案 4 :(得分:1)
还有另一种解决方案。用np.eye创建一个矩阵E。您可以如下更改主对角线。然后,再创建两个带有k参数的矩阵。最后,只需将所有矩阵合并在一起即可。
E = np.eye(5)
E = E*2
F = -1*np.eye(len(E),k=1)
G = -1*np.eye(len(E),k=-1)
E = E+F+G
print(E)
答案 5 :(得分:0)
numpy.diag(v, k=0)
k 从中心设置对角线位置。
即。 {k=0
:“默认中心”,k=(-1)
:“中心左侧1行”,k=1
:“中心右侧1行}
然后按照您通常的预期执行算术。
点击此处的文档:np.diag()。
In [3]: np.diag(np.arange(6), k=0)
Out[3]:
array([[0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0],
[0, 0, 0, 3, 0, 0],
[0, 0, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 5]])
In [4]: np.diag(np.arange(6), k=1)
Out[4]:
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 1, 0, 0, 0, 0],
[0, 0, 0, 2, 0, 0, 0],
[0, 0, 0, 0, 3, 0, 0],
[0, 0, 0, 0, 0, 4, 0],
[0, 0, 0, 0, 0, 0, 5],
[0, 0, 0, 0, 0, 0, 0]])
In [5]: np.diag(np.arange(6), k=-1)
Out[5]:
array([[0, 0, 0, 0, 0, 0, 0],
[0, 0, 0, 0, 0, 0, 0],
[0, 1, 0, 0, 0, 0, 0],
[0, 0, 2, 0, 0, 0, 0],
[0, 0, 0, 3, 0, 0, 0],
[0, 0, 0, 0, 4, 0, 0],
[0, 0, 0, 0, 0, 5, 0]])