我正在尝试用一个单独数组的列填充一个numpy数组的非对角线。对于类似于numpy.fill_diagonal的非对角线,有没有办法做到这一点?
假设:
A = np.zeros((4,4))
array([[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.],
[0., 0., 0., 0.]])
B = np.tril(np.arange(1,17).reshape(4,4),-1)
array([[ 0, 0, 0, 0],
[ 5, 0, 0, 0],
[ 9, 10, 0, 0],
[13, 14, 15, 0]]))
有没有办法用B的列填充A的外对角线?假设我想要A= B1:4,0的-1对角线,结果是下面的数组。
B[1:4,0] = array([ 5, 9, 13])
A =
array([[0., 0., 0., 0.],
[5., 0., 0., 0.],
[0., 9., 0., 0.],
[0., 0., 13, 0.]])
依此类推,直到A的最终输出为
A =
array([[0., 0., 0., 0.],
[5., 0., 0., 0.],
[10, 9., 0., 0.],
[15, 14, 13, 0.]])
据我所知,numpy.fill_diagonal提供了一种填充主对角线的方法,但没有用于非对角线的参数。numpy.diag确实有一个用于创建数组的非对角线参数,但它似乎不允许每个数组有多个非对角线。所以不允许这样做。
numpy.diag_indices也只返回主对角线的索引,所以我现在可以这样做。
row,col = np.diag_indices(A.shape[0])
for i in range(1,4):
A[row[i:],col[:-i]]=np.trim_zeros(B[:,i-1])
但只是想知道是否有更聪明的方法,即可以直接填充外对角线的函数,或者处理更大数组的矢量化方法。
发布于 2020-09-09 05:32:55
如果您追求的是方便,那么还有scipy.sparse.diags
和scipy.sparse.spdiags
,尽管它们的名字不同,但它们能够产生密集的输出。
对于您特定的输入格式,spdiags
可以更好地工作:
scipy.sparse.spdiags(B.T[:-1],[1,2,3],4,4,format="array").T
# array([[ 0, 0, 0, 0],
# [ 5, 0, 0, 0],
# [10, 9, 0, 0],
# [15, 14, 13, 0]])
https://stackoverflow.com/questions/63799229
复制相似问题