前言
数据的常见格式一般有:txt\csv\mat\Rdata,处理数据最常用的分析包是numpy和pandas,因此存储数据的常见的数据结构则是numpy中的ndarray和pandas中的series、dataframe,这次总结了几种将txt数据导成ndrray type的方法。
数据分析包 | 数据结构 |
---|---|
numpy | ndarray |
pandas | series\dataframe |
导入方法
0. 模块
数据分为两部分,描述(前3列)和标签(最后一列)。
from numpy import *
import numpy as np
import pandas as pd
1. IO操作
def io2matrix(filename):
f = open(filename)
arrayOfLines = f.readlines() # 按行读存入
numberOfLines = len(arrayOfLines) # 统计共n行
returnMat = zeros((numberOfLines, 3)) # 定义一个n*3的二维矩阵
classLabelVector = [] # 存放标签
index = 0 # 按索引定位,对应n
for line in arrayOfLines:
line = line.strip() # 对每行数据去换首尾行符
listFromLine = line.split('\t') # 整行数据分割为元素列表
returnMat[index,:] = listFromLine[0:3] # 将分割好的列表赋值给返回矩阵对应行的每一列
classLabelVector.append(int(listFromLine[-1])) # 同时将最后一列的标签添加到标签列表中
index += 1
print type(returnMat)
return returnMat,classLabelVector
知识点
- strip()
- line = line.split(‘\t’),这是常见的用法,要记得分割后重新赋值覆盖。
- returnMat[index,:] = listFromLine[0:3],矩阵、数组大小要对应
- classLabelVector.append(int(listFromLine[-1])),这是列表常见的
[1]
、['1']
区别,要明确通知解释器,列表中存储的是整型,才不会当作字符串处理。
2. numpy函数
def loadmatrix(filename):
returnMat = np.loadtxt(filename, delimiter='\t') # 导入数据
returnLabel = returnMat[:,-1] # 存放标签
returnMat = returnMat[:,0:3] # 存放数据
print type(returnMat)
return returnMat, returnLabel
知识点
- 使用loadtxt() 返回的就是ndarray类型的值。
- 先存标签,再覆盖。或者另外开辟空间存放。
3. pandas函数
这个方法最后测试还有一点问题,就是存在精度损失,还没有找到误差解决办法,后续再补。
-8.881784197e-16
-1.11022302463e-16
其中有两个数存在误差
def pd2matrix(filename):
returnMat = pd.read_csv(filename, header=None, delimiter='\t')
returnLabel = returnMat.iloc[:,-1].values
returnMat = returnMat.iloc[:,0:3]
print type(returnMat)
return returnMat, returnLabel
知识点
- read_csv() 返回的是dataframe,要用iloc定位。
- array和dataframe的转换:
array->dataframe
df = pd.DataFrame(array)
dataframe->array
array = df.values # df.iloc[:,:].values