numpy 如何制作一个np.数组的N对角矩阵

webghufk  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(118)

我想做一个M维的N个对角矩阵的数组,例如N=2和M=3,
数组应该是这样的:np.array([[[1,0,0],[0,2,0],[0,0,3]],[[5,0,0],[0,6,0],[0,0,7]])
主对角线上有随机元素

mfpqipee

mfpqipee1#

您可以通过创建形状为(n, m, m)的输出数组,然后使用numpy.arange索引最后两个轴的前导对角线来实现:

import numpy as np

rng = np.random.default_rng()

def generate_diagonal_matrices_nin17(n, m):
    idx_n = np.arange(n)
    idx_m = np.arange(m)
    
    out = np.zeros((n, m, m))
    
    out[idx_n[:, None], idx_m, idx_m] = rng.random((n, m))
    return out

计时(generate_diagonal_matrices来自用户3046211的答案):

%timeit -n 1000 generate_diagonal_matrices_nin17(100, 100)
%timeit -n 1000 generate_diagonal_matrices(100, 100)
441 µs ± 73.7 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
1.44 ms ± 645 µs per loop (mean ± std. dev. of 7 runs, 1,000 loops each)
6ju8rftf

6ju8rftf2#

你可以通过创建一个大小为N X M的随机数数组来实现。现在使用np.diag,我们可以创建对角矩阵,然后将它们堆叠在一起。你可以这么做

import numpy as np

def generate_diagonal_matrices(N, M):
    # Generate random numbers for the diagonals
    diagonals = np.random.rand(N, M)

    # Create diagonal matrices
    matrices = [np.diag(diagonals[i]) for i in range(N)]

    # Convert list of matrices to a numpy array
    return np.array(matrices)

N = 2
M = 3
result = generate_diagonal_matrices(N, M)
print(result)

这导致在对角线侧上具有随机元素的下面,总时间复杂度为O(N x M^2)

[[[0.5663498  0.         0.        ]
  [0.         0.74251659 0.        ]
  [0.         0.         0.31700871]]

 [[0.69622446 0.         0.        ]
  [0.         0.6330884  0.        ]
  [0.         0.         0.55743844]]]

相关问题