有没有办法填充类似于 numpy.fill_diagonal 的 numpy 数组的非对角线?
Is there a way to populate the off diagonals of a numpy array similar to numpy.fill_diagonal?
我正在尝试用单独数组的列填充 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 = B[1: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 也只有 returns 主对角线的索引,所以我现在可以做到这一点是这样的。
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])
但只是想知道是否有更聪明的方法来解决这个问题,即可以直接填充非对角线的函数或用于处理更大数组的矢量化方法。
如果您追求方便,还有 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]])
我正在尝试用单独数组的列填充 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 = B[1: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 也只有 returns 主对角线的索引,所以我现在可以做到这一点是这样的。
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])
但只是想知道是否有更聪明的方法来解决这个问题,即可以直接填充非对角线的函数或用于处理更大数组的矢量化方法。
如果您追求方便,还有 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]])