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
库的io
的read_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)
报错:
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.inf
(float64
类型)两个不能同时在np.clip()
函数中。
3. 解决方法
最后,如果想要解决该问题,只需将两个数组变为相同类型即可。注意:这里不能变换dur
类型,因为如果变换了后续处理会存在问题,不要问为什么,问就是试过了!!!!
因此,唯一解决方法就是:将无穷大的np.inf
(float64
类型)变换为无穷大的 uint32
类型的数值(这里操作的路径同上述问题分析中具体代码路径)。解决的代码如下:
tmp = 4294967295 # uint32类型的最大值
np.clip(dur, 1, tmp, out=dur)
最后,注意在修改并保存完代码后,需要重启内核,修改后的代码才有效果。
经修改后,代码可以跑通了!实在是不容易哦!!!
4. 总结
总的而言,感觉出现该错误可能就是我使用的版本中上偏高了(python=3.9
),不过好歹问题解决了。网上的相关教程根本没有,所以根据自己的经验来总结这篇文章,希望大家会喜欢。如果有什么疑问欢迎在评论区提出,对于共性问题可能会后续添加到文章介绍中。
如果觉得这篇文章对你有用,记得点赞、收藏并分享给你的小伙伴们哦😄。