本人模式小白,剛剛開始學python,主要是用numpy、scipy、matplotlib、pandas以及scikit-learn做數據處理及機器學習相關的東西。目前讀研一,希望和大家多多交流!
對於模式識別中的各個方向,我個人覺得就是傳感器不同,圖像處理用的是視覺、肌電用的是肌電貼、腦電用的是腦電采集設備、語音用的是麥克風。。。最終都是轉換成對數據的處理,如何從看似雜亂無章的數據中提取有用的信息,並進行分類操作等,就是特征提取。特征提取有很多種方法,這里就不說了,我也是剛剛起步,先把實驗數據存到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)