python把txt中字符串数据提取为numpy数组

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



  • 28
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值