2024-04-25 14:47:41 发布
网友
如何从矩阵a构造对角矩阵D 对角线矩阵D的第一个元素必须是矩阵A的次对角线上所有元素的乘积,对角线矩阵D的第二个元素必须是矩阵A的次对角线上除第一个元素外所有元素的乘积,对角线矩阵D中的第三个元素必须是除第一个元素和第二个元素外矩阵A的次对角线中所有元素的乘积,。。。。,对角矩阵D的最后一个元素必须是1
这里有一种方法:
def subdiag_prod_(a): sub_diag = np.diagonal(a, offset=-1) mask = np.triu(np.ones((sub_diag.shape*2))).astype('bool') m = sub_diag[:,None].T * mask ma = np.ma.array(sub_diag[:,None].T * mask, mask=~mask) diag = np.prod(ma, axis=1).data out = np.diag(diag) last_row = np.zeros([out.shape[0]+1]*2) last_row[:out.shape[0], :out.shape[1]] += out return last_row
a = np.random.randint(1,5,(10,10)) array([[2, 2, 1, 4, 3, 1, 3, 1, 4, 4], [2, 2, 2, 1, 1, 2, 3, 2, 2, 2], [4, 2, 2, 4, 2, 1, 3, 3, 3, 4], [2, 3, 3, 1, 1, 1, 4, 2, 3, 4], [3, 3, 1, 1, 2, 1, 3, 4, 4, 3], [1, 4, 4, 1, 1, 4, 1, 1, 1, 4], [4, 2, 3, 2, 1, 4, 4, 1, 3, 2], [4, 2, 2, 4, 4, 4, 1, 4, 3, 1], [1, 3, 1, 1, 2, 2, 2, 3, 4, 1], [1, 3, 2, 2, 3, 4, 1, 3, 2, 1]]) subdiag_prod(a) array([[288., 0., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 144., 0., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 72., 0., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 24., 0., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 24., 0., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 24., 0., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 6., 0., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 6., 0., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 2., 0.], [ 0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]])
详细信息
第一步是使用np.diagonal进行ndarray的次对角线:
np.diagonal
sub_diag = np.diagonal(a, offset=-1) # array([2, 2, 3, 1, 1, 4, 1, 3, 2])
我们可以使用np.tril创建一个mask,然后我们可以使用它以指定的方式获取次对角线元素i的乘积:
np.tril
mask
mask = np.triu(np.ones((sub_diag.shape*2))).astype('bool')
现在我们可以创建一个掩码数组,使用上面的ndarray作为掩码,将掩码和次对角线相乘:
ndarray
mask = np.ma.array(sub_diag[:,None].T * mask, mask=~mask)
现在我们可以取屏蔽数组的行积:
d = np.prod(ma, axis=1).data # array([288, 144, 72, 24, 24, 24, 6, 6, 2])
然后简单地用它建立一个二元矩阵:
out = np.diag(d) last_row = np.zeros([out.shape[0]+1]*2) last_row[:out.shape[0], :out.shape[1]] += out
这里有一种方法:
详细信息
第一步是使用
np.diagonal
进行ndarray的次对角线:我们可以使用
np.tril
创建一个mask
,然后我们可以使用它以指定的方式获取次对角线元素i的乘积:现在我们可以创建一个掩码数组,使用上面的
ndarray
作为掩码,将掩码和次对角线相乘:现在我们可以取屏蔽数组的行积:
然后简单地用它建立一个二元矩阵:
相关问题 更多 >
编程相关推荐