如何高效创建含缩放平移单位脉冲的二维对角数组?
问题描述
我正在寻找一种高效的方法来生成如下所示的二维数组:
array([[ 2., -0., -0., 0., -0., -0., 0., 0., -0., 0.], [ 0., -1., -0., 0., -0., -0., 0., 0., -0., 0.], [ 0., -0., -5., 0., -0., -0., 0., 0., -0., 0.], [ 0., -0., -0., 2., -0., -0., 0., 0., -0., 0.], [ 0., -0., -0., 0., -5., -0., 0., 0., -0., 0.], [ 0., -0., -0., 0., -0., -1., 0., 0., -0., 0.], [ 0., -0., -0., 0., -0., -0., 0., 0., -0., 0.], [ 0., -0., -0., 0., -0., -0., 0., 2., -0., 0.], [ 0., -0., -0., 0., -0., -0., 0., 0., -5., 0.], [ 0., -0., -0., 0., -0., -0., 0., 0., -0., 4.]])
该数组仅对角元素包含有效值。我目前的实现代码如下:
import numpy as np N = 10 k = np.random.randint(-5, 5, size=N) # weights xk = k * np.identity(N) # scaled+shifted unit impulses
请问是否有更直接的方式生成类似k*np.identity()的数组?比如借助scipy库,因为这类数组在DSP中较为常见。
解决方案
1. NumPy原生高效实现
不用依赖SciPy,NumPy自带的np.diag()就是专门生成对角数组的函数,比k * np.identity(N)更简洁高效:
import numpy as np N = 10 k = np.random.randint(-5, 5, size=N) xk = np.diag(k)
这个函数直接将一维数组k作为对角线元素生成二维对角矩阵,无需额外创建单位矩阵,内存开销更低,代码可读性也更强。
2. SciPy稀疏矩阵方案(适配DSP大规模场景)
如果是DSP中处理大规模数据,稀疏矩阵能大幅节省内存。SciPy的scipy.sparse.diags()可以生成对角稀疏矩阵:
import numpy as np from scipy.sparse import diags N = 10 k = np.random.randint(-5, 5, size=N) # 生成稀疏对角矩阵,可指定存储格式如csr、csc xk_sparse = diags(k, format='csr') # 若需要转为稠密数组,调用toarray() xk_dense = xk_sparse.toarray()
这种方式在矩阵规模较大时优势明显,稀疏矩阵仅存储非零的对角线元素,内存占用远低于稠密矩阵,且后续的滤波、卷积等DSP相关运算也能利用稀疏矩阵的高效算法。
3. 与原方案的对比优势
np.diag()避免了创建单位矩阵的额外内存消耗,代码逻辑更直接。- SciPy稀疏矩阵方案针对DSP场景优化,适合处理大规模信号数据,运算效率和内存利用率更高。
内容的提问来源于stack exchange,提问作者mins
相关产品推荐
相关产品推荐

