用2D ndarray给出的值填充3D ndarray中平方矩阵的对角线

发布于 2021-01-29 15:02:14

给定z具有形状的3D ndarray (k,n,n),是否可以不使用迭代就v用具有形状的2D ndarray给出的值填充k
nxn矩阵的对角线(k,n)

例如,运算结果应与循环遍历k个矩阵相同:

z = np.zeros((3,10,10))
v = np.arange(30).reshape((3,10))

for i in range(len(z)): 
    np.fill_diagonal(z[i], v[i])

有没有一种方法可以避免np.fill_diagonal在循环内反复调用?如果可能的话,我宁愿能够适用于更高维的数组,以及,一个解决方案,其中z.shape == (a,b,c,...,k,n,n)v.shape = (a,b,c,...,k,n)

关注者
0
被浏览
89
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    这是通用的n-dim数组-

    diag_view = np.einsum('...ii->...i',z)
    diag_view[:] = v
    

    另一个重塑-

    n = v.shape[-1] 
    z.reshape(-1,n**2)[:,::n+1] = v.reshape(-1,n)
    # or z.reshape(z.shape[:-2]+(-1,))[...,::n+1] = v
    

    另一个masking-

    m = np.eye(n, dtype=bool) # n = v.shape[-1] from earlier
    z[...,m] = v
    

    初始化输出z

    如果我们需要初始化输出数组z,并且要覆盖一般的n-dim情况,则应该是:

    z = np.zeros(v.shape + (v.shape[-1],), dtype=v.dtype)
    

    然后,我们继续前面列出的方法。



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看