You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何高效创建含缩放平移单位脉冲的二维对角数组?

问题描述

我正在寻找一种高效的方法来生成如下所示的二维数组:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:30:49