Scipy sosfilt ValueError ndarray 不是 C 连续的

Scipy sosfilt ValueError ndarray is not C-contiguous

提问人:Mike 提问时间:11/7/2023 最后编辑:Mike 更新时间:11/7/2023 访问量:29

问:

sosfilt从库中输入数组时给了我一个奇怪的 ValueError。scipy=1.9.3numpy=1.23.4

分子量:

import numpy as np
from scipy.signal import sosfilt

fs=48000

rng = np.random.default_rng()
signal = rng.normal(size=(fs))

b_0k = [1.01589602025559, 0.958943219304445, 0.961371976333197,
        2.22580350360974, 0.471735128494163, 0.115267139824401,
        0.988029297230954, 1.95223768730136]
b_1k = [-1.92529887777608, -1.80608801184949, -1.76363215433825,
        -1.43465048479216, -0.366091796830044, 0.0, -1.91243380293387,
        0.162319983017519]
b_2k = [0.922118060364679, 0.876438777856084, 0.821787991845146,
        -0.498204282194628, 0.244144703885020, -0.115267139824401,
        0.926131550180785, -0.667994113035186]
a_0k = np.ones(len(b_0k))
a_1k = [-1.92529887777608, -1.80608801184949, -1.76363215433825,
        -1.43465048479216, -0.366091796830044, -1.79600256669201,
        -1.91243380293387, 0.162319983017519]
a_2k = [0.938014080620272, 0.835381997160530, 0.783159968178343,
        0.727599221415107, -0.284120167620817, 0.805837815618546,
        0.914160847411739, 0.284243574266175]

sos = np.array([b_0k, b_1k, b_2k, a_0k, a_1k, a_2k]).T

signalFiltered = sosfilt(sos, signal, axis=0)

给我

signalFiltered = sosfilt(sos, signal, axis=0) 回溯(最近一次调用最后一次):

单元格 In[102],第 1 行 signalFiltered = sosfilt(sos, signal, axis=0)

文件 C:\ProgramData\Miniconda3\envs\devenv\lib\site-packages\scipy\signal_signaltools.py:4247 在 sosfilt _sosfilt(sos、x、zi)

文件 _sosfilt.pyx:81 在 scipy.signal._sosfilt._sosfilt

文件字符串source:660 in View.MemoryView.memoryview_cwrapper

View.MemoryView.memoryview 中的文件 stringsource:350。西尼特

ValueError:ndarray 不是 C 连续的

然而

signal.flags

显示

C_CONTIGUOUS : 真

F_CONTIGUOUS : 真

OWNDATA:真

可写 : 真

对齐:真

WRITEBACKIFCOPY:假

我也在从 wav 文件导入的其他信号上尝试过这个,但出现了同样的错误。环顾四周,似乎没有任何已知问题或使用此函数的此错误的其他示例(尽管在其他地方讨论了一些机器学习包错误)

Scipy有什么问题?

numpy 过滤器 信号处理 numpy-ndarray

评论

1赞 hpaulj 11/7/2023
这是给出问题的转置,使其 F 连续。添加一个.copy()
0赞 Mike 11/7/2023
谢谢@hpaulj - 修改以使其正常工作。你想把这个添加为答案吗?如果你有时间,也要有一点解释就好了......signalFiltered = sosfilt(sos.copy(order='C'), signal, axis=0)

答:

1赞 hpaulj 11/7/2023 #1

是转置带来了问题,使它.添加 .F contiguous.copy()

查看转置和复制之前和之后的数组标志。

transpose通过反转步幅和形状来工作。这是一种廉价的工作方式,但会破坏连续性。view