Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output

Cannot cast ufunc clip output from dtype 'float64' to dtype 'uint32' with casting rule 'same_kind'

  • 0. 错误介绍
  • 1. 环境介绍
  • 2. 问题分析
  • 3. 解决方法
  • 4. 总结

0. 错误介绍

在加载BCI Competition IV 2a数据集时,当使用mne库的ioread_raw_gdf()函数时出错。注:该代码只是按照正常途径读取GDF文件。
代码如下:

import mne
import matplotlib.pyplot as pl
import numpy as np
import os

filename = "../../dataset/BCICIV_2a_gdf/A02E.gdf" #文件位置根据实际情况修改
raw = mne.io.read_raw_gdf(filename)
print(raw.info)
print(raw.ch_names)

报错:
Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output_第1张图片Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output_第2张图片

1. 环境介绍

考虑到在网上找了众多关于mne库读取gdf文件的文章均没有出现该问题,同时网上找到的关于该报错信息的内容也均未出现上文的情况。因此,在不知道是不是使用mne版本有误的情况下,将代码使用的环境进行记录。

数据来源:BCI Competition IV: Download area
代码环境:python版本为:3.9、mne版本为:1.4.2、numpy版本为:1.25.0

albumentations      1.2.1
asttokens           2.2.1
backcall            0.2.0
certifi             2023.5.7
charset-normalizer  3.1.0
chinese-calendar    1.8.0
colorama            0.4.6
comm                0.1.3
contourpy           1.1.0
cycler              0.11.0
debugpy             1.6.7
decorator           5.1.1
executing           1.2.0
fonttools           4.40.0
idna                3.4
importlib-metadata  6.7.0
importlib-resources 5.12.0
ipykernel           6.23.3
ipython             8.14.0
jedi                0.18.2
Jinja2              3.1.2
jupyter_client      8.3.0
jupyter_core        5.3.1
kiwisolver          1.4.4
MarkupSafe          2.1.3
matplotlib          3.7.1
matplotlib-inline   0.1.6
mne                 1.4.2
nest-asyncio        1.5.6
numpy               1.25.0
packaging           23.1
parso               0.8.3
pickleshare         0.7.5
Pillow              9.5.0
pip                 23.1.2
platformdirs        3.8.0
pooch               1.7.0
prompt-toolkit      3.0.38
psutil              5.9.5
pure-eval           0.2.2
Pygments            2.15.1
pyparsing           3.1.0
pypiwin32           223
python-dateutil     2.8.2
pyttsx3             2.90
pywin32             306
pyzmq               25.1.0
qudida              0.0.4
requests            2.31.0
scipy               1.11.0
setuptools          67.8.0
six                 1.16.0
stack-data          0.6.2
torchaudio          0.12.1+cu116
torchvision         0.13.1+cu116
tornado             6.3.2
tqdm                4.65.0
traitlets           5.9.0
typing_extensions   4.6.3
urllib3             2.0.3
wcwidth             0.2.6
wheel               0.38.4
zipp                3.15.0

2. 问题分析

首先对问题进行分析,根据报错信息以及报错中的问题指出可以发现,错误来源于mne库包中io库包中的一个edf.py的文件中的第1362行
具体地址为:anaconda存放环境地址+ 本conda环境名称+\lib\site-packages\mne\io\edf\edf.py:1362
具体代码为:np.clip(dur, 1, np.inf, out=dur)
错误为:UFuncTypeError: Cannot cast ufunc 'clip' output from dtype('float64') to dtype('uint32') with casting rule 'same_kind',即clip函数中数据必须为同类型,不能同时存在float64类型和uint32类型

因此,分析出错误原因为:dur数组(uint32类型)和np.inffloat64类型)两个不能同时在np.clip() 函数中。

3. 解决方法

最后,如果想要解决该问题,只需将两个数组变为相同类型即可。注意:这里不能变换dur 类型,因为如果变换了后续处理会存在问题,不要问为什么,问就是试过了!!!!

因此,唯一解决方法就是:将无穷大的np.inffloat64类型)变换为无穷大的 uint32类型的数值(这里操作的路径同上述问题分析中具体代码路径)。解决的代码如下:

tmp = 4294967295 # uint32类型的最大值
np.clip(dur, 1, tmp, out=dur)

最后,注意在修改并保存完代码后,需要重启内核,修改后的代码才有效果。
经修改后,代码可以跑通了!实在是不容易哦!!!
Bug小能手系列(python)_8: 使用mne库读取gdf文件报错 Cannot cast ufunc ‘clip‘ output_第3张图片

4. 总结

总的而言,感觉出现该错误可能就是我使用的版本中上偏高了(python=3.9),不过好歹问题解决了。网上的相关教程根本没有,所以根据自己的经验来总结这篇文章,希望大家会喜欢。如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。

如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦。

你可能感兴趣的:(Bug小能手,bug,python,开发语言,脑机接口,运动想象)