一、Python基础、数据加载及其可视化
1_Python基础
print(“hello world”)
python代码每一行之间是没有分号隔开的!
print(“hello world”)
print(“hello EEG”)
注释:“#”,批量/解释注释:ctrl+1
python层次控制
MATLAB中使用 end 来控制不同的层次,而python使用 “Tab”来控制不同语句的层次
%MATLAB层次控制
if <condition>
<statements>
if <condition>
<statements>
end %作为流程控制
end
if <condition>
<statements>
if <condition>
<statements>
end %作为流程控制
end
#Python层次控制 #完整的语句后一定没有冒号,判断、条件、循环这些非完整的语句使用冒号
if <condition>:
<statements> #使用tab来表示层次。
if <condition>:
<statements>
python运算符
https://www.runoob.com/python/python-operators.html
python流程控制语句
循环:https://www.runoob.com/python3/python3-loop.html
判断:https://www.runoob.com/python/python-if-statement.html
跳转语句:continue跳出当次循环继续下一次、break直接跳出当前循环
碰到死循环或者程序长时间不响应:ctrl+c等方法
conda pip wheel
有时候,我们需要从互联网上下载其他研究者打包好的模块,一般使用这三个执行。优先conda–pip–wheel
安装以下软件库:
- mne 加载EEG
- numpy 矩阵运算
- matplotlib 绘图
- seaborn 绘图
- pandas 行为数据处理
- scipy 读取matlab文件
- nibabel 读取fMRI文件
- scikit-learn 机器学习
python库的导入
import numpy
import numpy as np
#使用from加载大库中的一个小库
from numpy import random
from numpy import *
from numpy.random import randint
2_Python数据加载及其可视化
2.1 nii、edf数据加载
nii加载结构项,用的较少(略)
补:eeg数据的读取
很少用python直接读取eeg数据,大多都在matlab中进行预处理和特征提取后,保存为.mat文件再读入python中
相关内容可直接百度read_epochs_eeglab
import mne
import matplotlib.pyplot as plt
#使用ctrl+鼠标左键可以查看函数说明
data_path = r"C:\Users\lwh\Desktop\eeg_and_machine_learning\data\1_LH.set"
raw_data = mne.io.read_epochs_eeglab(data_path)
#查看属性
raw_data.info
raw_data.info['ch_names'] #通道名
raw_data.ch_names
#读取EEG的原始数据
raw_data_data = raw_data._data
raw_data_data.shape
raw_data.plot()
plt.show() #画完图后调用这个函数显示图片
补:npy数据读取
import numpy as np
data = np.load(r'C:\Users\lwh\Desktop\eeg_and_machine_learning\data\data.npy')
2.2 csv、mat、txt文件加载
csv数据读取
地址前的r表示进入只读模式,否则会由于转义字符\t报错
import pandas as pd
csv_file_path = r'C:\Users\lwh\Desktop\eeg_and_machine_learning\data\csv_test.csv'
cvs_file = pd.read_csv(csv_file_path)
读取.mat文件
mat_file是dict字典类型,提取里面的data,并指定保存地址
import scipy
mat_file_path = r"C:\Users\lwh\Desktop\eeg_and_machine_learning\data\mat_test.mat"
mat_file = scipy.io.loadmat(mat_file_path)
mat_file_data = mat_file['data']
#.mat文件的保存
mat_file_save_path = r"C:\Users\lwh\Desktop\eeg_and_machine_learning\data\mat_test_save.mat"
scipy.io.savemat(mat_file_save_path,{"x":mat_file_data})
{“mat_data”:mat_file_data, ‘va’:1}里面可以写多个字典形式的数据
读取txt文件
txt_test1中分隔符为空格,默认可不指定
txt_test2中分隔符为“,”,需要指定分隔符delimiter = “,”
#读取txt文件
import numpy as np
#https://docs.scipy.org/doc/numpy-1.15.0/reference/generated/numpy.loadtxt.html
txt_file_paht = r'C:\Users\lwh\Desktop\eeg_and_machine_learning\data\txt_test2.txt'
txt_file_2 = np.loadtxt(txt_file_paht,delimiter = ",")
#txt_file = np.loadtxt(txt_file_paht)
2.3 数据可视化及绘图基础
numpy
matplotlib
绘图流程:
1)库加载
import matplotlib
import matplotlib.pyplot as plt
from matplotlib import style
2)绘制步骤
#2.1 给一个横坐标的list,给一个纵坐标的list,注意都是list类型
plt.bar(X,Y) #柱状图
plt.scatter(X,Y) #散点图
plt.plot(X,Y) #折线图
#2.2 设置参数
plt.xlable, plt.ylable #设置x,y轴的标题文字
plt.title #设置标题
plt.xlim, plt.ylim #设置x,y轴显示范围
3)图像绘制(Spyder中可以不写)
plt.show()
#图像保存(可选)
plt.saveFig()
折线图:plt.plot()
https://matplotlib.org/stable/plot_types/basic/plot.html
example文档:
https://matplotlib.org/stable/plot_types/index.html
https://matplotlib.org/stable/gallery/index.html
sklearn
3_Python进阶
3.1 函数定义及使用
def sum(num1,num2):
#两数之和
return num1+num2
# 调用函数
print(sum(5,6))
3.2 函数传参方法
def main(name): # name 即为形参
print(name)
return name
main("python") # python 即为实参
# 位置传参,实参与形参需要一一对应,不可多也不可少。
def main(name, age, hobby):
content = [name, age, hobby]
print(content)
return content
content = main("张三", 26, "playgame")
# 关键字传参,实参与形参无需一一对应,不可多也不可少。实参和形参按照形参名进行匹配,可以不按照位置进行匹配。
def main(name, age, hobby):
content = [name, age, hobby]
print(content)
return content
content = main(age=28, name="王五", hobby="fishing")
#位置传参和关键字传参混合使用
def main(name, age, hobby):
content = [name, age, hobby]
print(content)
return content
# content = main(name="张三", 28, hobby="fishing") # 报错:位置传参必须写在关键字传参的左边
# content = main("张三", 28, age="fishing") # 报错:同一个参数不能两次或者多次传值,只能传一次
content = main("张三", age=28, hobby="fishing")
3.3 Python基础数据结构
四种基础数据结构
- list(列表) #可变:可改变里面的数据值
- tuple(元组)#不可变:一经创建,不可改变,要改只能重新创建
- set(集合) #可变
- dict(字典) #可变
list列表
列表(list)是python中使用最频繁的数据类型,它是放在方括号([])内、用逗号分隔的一系列元素。列表中元素的类型可以不同,它支持数字、字符串甚至可以包含列表。换言之,列表允许嵌套。python中列表是可变的,且元素可重复。
列表的创建:
list1 = ['fMRI', 'EEG', 2022, 6,11]
list2 = [1, 2, 3, 4, 5 ]
list3 = ["a", "b", "c", "d"]
list4 = [list1,list2,list3,list4] #表中表,通过[i][j]缩影
列表的截取:
list1 = [1,2,3,4,5,6,7,8,9,10]
1)从0开始 list[0] list[2]
2)列表截取,左闭右开 list[1:4]
3)冒号索引、默认值 list[3:] list[:3]
4)负数索引 list[-3] list[-1] list[-3:-1] list[-3:] list[:-3] list[:]
列表的方法:
list.append(x) # 把一个元素添加到列表的结尾
list.insert(i, x) #在指定位置插入一个元素。第一个参数是准备插入到其前面的那个元素的索引,例如a.insert(0, x) 会插入到整个列表之前,而 a.insert(len(a), x) 相当于 a.append(x) 。
list.remove(x) #删除列表中值为 x 的第一个元素。如果没有这样的元素,就会返回一个错误。
list.pop() #从列表的指定位置移除元素,并将其返回。如果没有指定索引,list.pop(i)
a.pop()返回最后一个元素。元素随即从列表中被移除。
list.index(x) #返回列表中第一个值为 x 的元素的索引
list.sort(x) #对列表中的元素进行排序。
list.count(x) #返回 x 在列表中出现的次数。
del:通过缩影删除list中的某个值
列表操作符
#加号和乘号
[1,2,3] + [1,2,3] #拼接
[1,2,3]*2 #重复
列表的内建函数
len(list)
max(list)
min(list)
list() #list函数
查看函数说明的三种方法
#1)用ctrl+鼠标左键 只对部分有用 而且有的跳转过后还没有注释
import scipy.io
mat_file_path = r'D:\脑电与机器学习2\python基础-数据加载示例数据\mat\test.mat'
mat_file = scipy.io.loadmat(mat_file_path)
#2)输入一个括号,旁边出现小框简单提示
list1.append()
list1.sort()
#3)help 选中按ctrl+i 在函数上方
list1.sort()
mat_file = scipy.io.loadmat(mat_file_path)
tuple元组
不可变的!一经创建,不能更改!
通过括号连接 a = (1,2,3,4)
可以索引,不能更改!
set集合
使用大括号 { } 或者 set() 函数创建集合,a = {1,2,4,‘a’}。集合是无序的、不支持+,*, index, slice
集合的常见操作:
add、update方法:增加
remove方法:删除
len方法:获取长度
dic字典
dic是一种可变的数据结构,可以储存任意类型的变量。集合也是无序、不可重复的,d = {key1 : value1, key2 : value2 }。
键一般是唯一的,如果重复最后的一个键值对会替换前面的,值不需要唯一。
dic的创建:
tel = {'jack': 4098, 'sape': 4139}
字典的特性:
不支持+,*, index, slice(因为集合无序不重复的)
支持in和not in
d = {"name":"westos", "age":18, "city":"西安"}
print('name' in d) # True, 判断是否为所有key值得成员
print("westos" in d) # False
字典的索引:字典只能通过key索引
tel = {'jack': 4098, 'sape': 4139}
tel['guido'] = 4127
字典的方法:
dic.keys()
list(tel.keys())
dic.values()
len(dic)
字典的遍历:
d = {"name":"eeg", "age":18, "city":"成都"}
#默认情况下,字典只会遍历key值
for item in d:
print(item)
#如果遍历字典的key和value呢?(特别特别重要)
for key,value in d.items():
print(key,value)
3.4 类、实例、方法、构造函数
类(面向对象编程):
类是某类事物的统称,对象是实物。
例如:动物是一个类,狗或者猫则是对象。猫和狗是对对象的实例化。
关键词 class 类实例化后的类叫作对象对象可以调用方法和属性
定义一个基础类:
class test_class:
x = 1 #x是class的属性
p = test_class()
p.x #通过.调用属性
init()函数:
所有类都有一个名为 init() 的函数,它始终在启动类时执行。
使用 init() 函数将值赋给对象属性,或者在创建对象时需要执行的其他操作:
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
p1 = Person("Bill", 63)
print(p1.name)
print(p1.age)
#每次使用类创建新对象时,都会自动调用 init() 函数
对象方法:
对象也可以包含方法。对象中的方法是属于该对象的函数。
#self 参数是对类的当前实例的引用,用于访问属于该类的变量。
#所有类方法,第一个参数都必须为self
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def myfunc(self):
print(self.name) #要使用self访问
p1 = Person("Bill", 63)
p1.myfunc()
修改对象属性:
p1.age = 40
del p1
类的继承:
继承的主要作用是实现代码的重用。继承使得子类拥有父类的方法和属性。·
class animal:
test = 1
#def __init__(self,test):
# self.test = test
def eat(self):
print("吃")
def drink(self):
print("喝")
class dog(animal):
def dark(self):
print("汪汪叫")
goudan = dog()
goudan.eat()
goudan.drink()
#注:python2.0需要继承obejct基类,python3不需要