Scipy中使用sparse数组调用signal.correlate出现维度错误的问询
问题:Scipy稀疏矩阵与signal.correlate配合报错维度不一致
尝试用Scipy的稀疏矩阵计算序列相关,收到错误提示ValueError: in1 and in2 should have the same dimensionality,但两者打印的形状看似一致。示例代码如下:
import numpy import scipy.signal as signal import scipy.sparse as sparse my_sparse = sparse.csr_array(numpy.random.rand(10)) print(my_sparse) print(my_sparse.shape) my_dense = numpy.expand_dims(numpy.random.rand(10), 1).T print(my_dense) print(my_dense.shape) corr = signal.correlate(my_sparse, my_dense, method="direct", mode="full") print(corr) print(corr.shape)
运行输出:
$ python test_sparse_with_correlate.py (0, 0) 0.9842628978990572 (0, 1) 0.21288927130505086 (0, 2) 0.11321754428562536 (0, 3) 0.02907902961562403 (0, 4) 0.06534326022150638 (0, 5) 0.5611332833785263 (0, 6) 0.6693945587792903 (0, 7) 0.6421603953803423 (0, 8) 0.7299602339571223 (0, 9) 0.5241172106721759 (1, 10) [[0.5422929 0.27431614 0.65966523 0.05579376 0.41876797 0.46535913 0.13079666 0.97518169 0.49505634 0.68287069]] (1, 10) Traceback (most recent call last): File "/mnt/alt_wkdir/118_serial_correlation/code/test_sparse_with_correlate.py", line 13, in <module> corr = signal.correlate(my_sparse, my_dense, method="direct", mode="full") ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "/mnt/bioinf_tools/miniconda3/envs/scipy/lib/python3.12/site-packages/scipy/signal/_signaltools.py", line 231, in correlate raise ValueError("in1 and in2 should have the same dimensionality") ValueError: in1 and in2 should have the same dimensionality
尝试过将数组转置为(10,1)形状,仍得到相同错误;当前使用Scipy v1.11.4,新旧conda环境均存在该问题。询问是否可以将scipy.sparse与scipy.signal.correlate配合使用,以及具体操作方法。
解决方案
scipy.signal.correlate不直接支持稀疏矩阵输入,其内部逻辑针对稠密数组设计,虽然稀疏矩阵和稠密数组的shape显示一致,但底层类型不兼容,导致维度检查逻辑误判。可行的解决方法有两种:
- 转换为稠密数组计算(推荐小规模场景)
如果稀疏矩阵的规模不大,直接用.toarray()方法将其转换为稠密数组后再调用correlate,这是最简单的实现方式。修改后的代码示例:import numpy import scipy.signal as signal import scipy.sparse as sparse my_sparse = sparse.csr_array(numpy.random.rand(10)) my_dense = numpy.expand_dims(numpy.random.rand(10), 1).T # 将稀疏矩阵转为稠密数组 corr = signal.correlate(my_sparse.toarray(), my_dense, method="direct", mode="full") print(corr) print(corr.shape) - 手动实现稀疏矩阵的互相关(适用于大规模场景)
如果稀疏矩阵规模极大,转稠密会占用过多内存,可以利用稀疏矩阵的乘法特性手动计算。对于1D序列的互相关,本质是滑动内积:对于形状为(1, N)的稀疏矩阵和(1, M)的稠密数组,full模式的互相关结果可通过构造循环矩阵后执行矩阵乘法实现,需注意索引方向和对齐逻辑。
- 转换为稠密数组计算(推荐小规模场景)
内容的提问来源于stack exchange,提问作者dllahr
相关产品推荐
相关产品推荐

