Numpy 快速设置(M x N x N)矩阵对角线的方法?Einsum/n维填充?对角线?

Numpy 快速设置(M x N x N)矩阵对角线的方法?Einsum/n维填充?对角线?,numpy,matrix,optimization,diagonal,numpy-einsum,Numpy,Matrix,Optimization,Diagonal,Numpy Einsum,我正在尝试基于矩阵编写快速、优化的代码,最近发现einsum是实现显著加速的工具 是否可以使用它有效地设置多维数组的对角线,或者它只能返回数据 在我的问题中,我试图通过对每个正方形(nxn)矩阵中的列求和来设置正方形矩阵数组(形状:mxnnxn)的对角线 我目前(缓慢、基于循环)的解决方案是: # Build dummy array dimx = 2 # Dimension x (likely to be < 100) dimy = 3 # Dimension y (likely to

我正在尝试基于矩阵编写快速、优化的代码,最近发现einsum是实现显著加速的工具

是否可以使用它有效地设置多维数组的对角线,或者它只能返回数据

在我的问题中,我试图通过对每个正方形(nxn)矩阵中的列求和来设置正方形矩阵数组(形状:mxnnxn)的对角线

我目前(缓慢、基于循环)的解决方案是:

# Build dummy array
dimx = 2  # Dimension x (likely to be < 100)
dimy = 3  # Dimension y (likely to be between 2 and 10)
M = np.random.randint(low=1, high=9, size=[dimx, dimy, dimy])

# Blank the diagonals so we can see the intended effect
np.fill_diagonal(M[0], 0)
np.fill_diagonal(M[1], 0)

# Compute diagonals based on summing columns
diags = np.einsum('ijk->ik', M)

# Set the diagonal for each matrix 
# THIS IS LOW. CAN IT BE IMPROVED?
for i in range(len(M)):
    np.fill_diagonal(M[i], diags[i])

# Print result   
M
#构建虚拟数组
dimx=2#尺寸x(可能小于100)
dimy=3#尺寸y(可能介于2和10之间)
M=np.random.randint(低=1,高=9,大小=[dimx,dimy,dimy])
#空白的对角线,以便我们可以看到预期的效果
np.fill_对角线(M[0],0)
np.fill_对角线(M[1],0)
#基于求和列计算对角线
diags=np.einsum('ijk->ik',M)
#为每个矩阵设置对角线
#这太低了。可以改进吗?
对于范围内的i(len(M)):
np.fill_对角线(M[i],对角线[i])
#打印结果
M

这能改进吗?似乎np.fill_对角线不接受非方矩阵(因此强制我使用基于循环的解决方案)。也许einsum在这里也能有所帮助?

一种方法是将列重塑为
2D
,使用对角线值将列设置为
ncols+1
。重塑创建了一个视图,因此允许我们直接访问这些对角线位置。因此,执行工作将是非常重要的-

s0,s1,s2 = M.shape
M.reshape(s0,-1)[:,::s2+1] = diags
如果你做
np.source(np.fill\u diagonal)
你会发现在2d案例中,它使用了一种“跨步”方法

    if a.ndim == 2:
        step = a.shape[1] + 1
        end = a.shape[1] * a.shape[1]
    a.flat[:end:step] = val
@Divakar的
解决方案通过在二维空间上“展平”来将此应用于3d案例

您可以使用
M.sum(axis=1)
对列求和。虽然我模糊地回忆起一些计时,发现
einsum
实际上要快一点<代码>求和更为传统


有人要求能够在
einsum
中扩展维度,但我认为这不会发生。

那么,复制和粘贴
np.fill\u diagonal
的源代码如何帮助改进它以更快地填充对角线呢?我的答案更像是你的脚注。谢谢。这很有效。有没有进一步的方法来加快速度,以避免进行大量的重塑?@PhysLQ好吧,重塑以创建视图是访问阵列的最佳方式,重塑几乎是免费的。我看不到在所提议的方法中有任何其他的重塑用法,或者我们是否需要在其他地方进行重塑?