对于模式识别中的各个方向,我个人觉得就是传感器不同,图像处理用的是视觉、肌电用的是肌电贴、脑电用的是脑电采集设备、语音用的是麦克风。。。最终都是转换成对数据的处理,如何从看似杂乱无章的数据中提取有用的信息,并进行分类操作等,就是特征提取。特征提取有很多种方法,这里就不说了,我也是刚刚起步,先把实验数据存到numpy数组中才是最基础的~~

一般来说做实验的时候把实验数据保存txt文件中,然后利用实验数据进行离线的训练及测试。下面的数据是利用MYO手环做肌电实验保存的。


[-6, -7, 29, -19, -8, -10, -2, -2]
 
 
[3, -8, -21, -8, 0, 2, 10, -9]
 
 
[-6, -1, -8, 30, -5, -4, 4, -4]
 
 
[9, 25, 22, -1, 4, -4, 0, 10]
 
 
[29, 9, 25, 14, -6, -1, 3, 3]
 
 
[18, 4, 68, 27, -1, -3, -16, 8]
 
 
[0, 1, -21, -21, 1, -4, 0, 10]
 
 
[-3, -3, -3, -59, -5, 6, 7, -2]
[6, -2, 34, 6, -1, 12, -4, -38]
 
 
[0, -3, -20, -12, -5, -5, -23, 2]
[-8, -6, 55, 37, -4, -9, 3, 17]
 
 
[-8, -20, -6, 20, -7, -4, 6, 4]
 
 

  
  .......


由于数据非常多,这里只写出一小部分。在txt文件中的数据都是以字符串的形式保存的,每一行的结尾都会存在一个‘\n’的字符,另外从数据中还可以看出来‘[’,‘]’,‘,’以及‘ ’都不是我们要提取的信息,所以在处理的过程中要把这些字符删除。由于里面还会有负数,所以导致各行数据的长度也都不一样,而且‘-’也是一个字符,并不能直接靠特定字符位置进行处理。

还好python有强大的列表功能,strip(),split()函数可以帮助我们完成这项任务。先简单介绍一下这两个函数:

strip(rm):删除s字符串中开头、结尾处,rm字符。当rm为空时默认删除空白符(包括'\n', '\r',  '\t',  ' ')

split(del):通过指定分隔符(del)对字符串进行切片,如果参数num有指定值,则仅分隔num个子字符串。

import numpy as np

file = open("1.txt","r")
list_arr = file.readlines()
l = len(list_arr)
for i in range(l): 
    list_arr[i] = list_arr[i].strip() 
    list_arr[i] = list_arr[i].strip('[]') 
    list_arr[i] = list_arr[i].split(", ")
a = np.array(list_arr)
a = a.astype(int)
print (a)
file.close()




利用for循环对列表list_arr中每一个元素进行处理,最后用numpy中的array函数将其转换成numpy数组,并用astype函数把字符串数组转换成int数组。输出结果如下:

[[ -3   3   2 ...,  -2  -6  -4]
[  2   9 -64 ..., -10  14  -2]
 [ -1  -1 -20 ...,  13  -6   1]
..., 
[  0 -38 -23 ...,   1  -1   0]
[-11   4 -56 ...,   0  -1  -6]
[-12 -51 -75 ...,   2   0  -4]]

结果是一个二位数组,这样后面我们对这个数组进行一些科学计算操作就会变得很方便了。

这种方法是我最开始写的,获取列表list_arr的长度进行循环,这是传统的c语言的思想,接触python后,列表有自己风格的迭代:

import numpy as np

file = open("1.txt","r")
list_arr = file.readlines()

lists = []

for index,x in enumerate(list_arr):
    x = x.strip()
    x = x.strip('[]')
    x = x.split(", ")
    lists.append(x)
a = np.array(lists)
a = a.astype(int)
print (a)
file.close()





for index,x in enumerate(list_arr) 是python列表特有的迭代风格,表示列表中第index个元素x,每次遍历一遍index会加1,x也会变成下一个元素。当然这里没有用到index,只是为了表达python迭代的风格。这里可以用for x in list_arr:这条语句代替,也挺酷的~  append(x)函数是在原有列表基础上添加一个元素x。

当然,对于字符串操作还有一个利器:正则表达式!

import numpy as np
import re

file = open("1.txt","r")
list_arr = file.readlines()

lists = []

r = '[’,[\\]]'
for index,x in enumerate(list_arr):
    a = re.sub(r,'',x)
    c = a.strip()
    c = c.split()
    lists.append(c)
m = np.array(lists)
m = m.astype(int)
print (m)
file.close()


如果不了解正则表达式又想用它来删除字符串中特定字符的话,这个是万能的,自己删吧! r =

'[’!"#$%& 
\' 
()*+,./:;<=>?@[ 
\\ 
]^_`{|}~]'


对于这三种方法,我进行了一下测试,发现前两种差距不大,正则表达式则慢很多。相比较而言的话,我更偏向于第二种方法,毕竟这才是python嘛~

由于初步学习,难免会有说错的地方,希望大家能批评指出!另外,代码也是存在很多不规范,代优化的地方,以后会慢慢改进的!最后附上测试代码,测试哪部分就把哪的注释给去掉就行了。

import time
import numpy as np
import re

start = time.time()

for y in range(1000):
    file = open("1.txt","r")
    list_arr = file.readlines()
    '''
    l = len(list_arr)
    for i in range(l):
        list_arr[i] = list_arr[i].strip()
        list_arr[i] = list_arr[i].strip('[]')
        list_arr[i] = list_arr[i].split(", ")
    a = np.array(list_arr)
    a = a.astype(int)
    print (a)
    '''
    '''
    lists = []
    for x in list_arr:
        x = x.strip()
        x = x.strip('[]')
        x = x.split(", ")
        lists.append(x)
    a = np.array(lists)
    a = a.astype(int)
    print (a)
    '''
    '''
    lists = []
    r='[’,[\\]]'
    for index,x in enumerate(list_arr):
        a = re.sub(r,'',x)
        c = a.strip()
        c = c.split()
        lists.append(c)
    m = np.array(lists)
    m = m.astype(int)
    print (m)
    '''
    file.close()

print ((time.time()-start)/1000)