当前位置: 首页 > 面试题库 >

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

查淮晨
2023-03-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)


问题答案:

这是通用的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)

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



 类似资料:
  • 这得到了我想要的,但可能没有很好地扩展? 产量

  • 问题内容: 我有以下代码: 它创建一个填充零的矩阵。相反,我想知道是否有一种函数或方法可以将它们初始化为s,而方法很简单。 问题答案: 您很少需要在numpy中进行矢量操作循环。您可以创建一个未初始化的数组并立即分配给所有条目: 我已经在这里和Blaenk发布的时间安排了时间: 时序显示优先选择作为更快的替代方案。OTOH,我喜欢numpy的便捷实现,在该实现中您可以同时为整个slice分配值,代

  • 问题内容: 如何更改numpy中矩阵对角线的值? 我检查了Numpy Modify ndarray对角线 ,但是在numpy v 1.3.0中没有实现该功能。 假设我们有一个np.array X,我想将对角线的所有值设置为0。 问题答案: 你尝试了吗?请参阅以下答案和此讨论。或文档中的以下内容(尽管当前已损坏): http://docs.scipy.org/doc/numpy/reference/

  • (来自讲义参考)为了使高斯-塞德尔和雅可比方法收敛,有必要检查系数矩阵是否对角占优,即对角元素应该在其列中的所有元素中具有最大的值。如果它还不是对角占优,请使用旋转。对于对角占优的矩阵,应满足以下条件:(这也称为收敛) 是否有任何预定义的函数可以在maxima中使用以实现收敛,或者应该使用交换进行循环,以及应该使用什么约束?假设矩阵的大小为3x3,具有非零元素。 我已经看到了一些相关的问题,但答案

  • 如果数据帧列中的单元格值匹配,我试图用"1"s填充相邻矩阵。“1”的位置基于同一行中的相应值。 更准确地说:数据帧pat1 我想填充矩阵单元格,,,和在空矩阵与相应的行/cole. name与"1"起,和,分别。 所需的输出将是带有列名的矩阵(数据=c(0,1,0,0,1,0,0,0,0,0,0,1,0,0,0,1,0),nrow=4,byrow=T) 我找过了,但还没有找到方法。

  • 特殊矩阵——三对角矩阵(Tridiagonal Matrix) 注:压缩存储的矩阵可以分为特殊矩阵和稀疏矩阵。对于那些具有相同元素或零元素在矩阵中分布具有一定规律的矩阵,被称之为特殊矩阵。对于那些零元素数据远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称之为稀疏矩阵。 1. 三对角矩阵的概念 三对角矩阵就是对角线、邻近对角线的上下次对角线上有元素,其他位置均为0的矩阵。 三对角矩阵是一种特