提问人:Mike 提问时间:11/7/2023 最后编辑:Mike 更新时间:11/7/2023 访问量:29
Scipy sosfilt ValueError ndarray 不是 C 连续的
Scipy sosfilt ValueError ndarray is not C-contiguous
问:
sosfilt
从库中输入数组时给了我一个奇怪的 ValueError。scipy=1.9.3
numpy=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有什么问题?
答:
是转置带来了问题,使它.添加 .F contiguous
.copy()
查看转置和复制之前和之后的数组标志。
transpose
通过反转步幅和形状来工作。这是一种廉价的工作方式,但会破坏连续性。view
评论
.copy()
signalFiltered = sosfilt(sos.copy(order='C'), signal, axis=0)