读取鸢尾花数据集时报错:KeyError: b’Iris-setosa’
解决方式:在字符串前加 ‘b’
附:
1. 鸢尾花数据集介绍(csdn下载数据集)
数据集内包含 3 类鸢尾花,分别为山鸢尾(Iris-setosa)、变色鸢尾(Iris-versicolor)和维吉尼亚鸢尾(Iris-virginica)。每类各 50 个数据,每条记录有 4 项特征:花萼长度、花萼宽度、花瓣长度、花瓣宽度。数据格式如下:
2. 使用 numpy 模块的 loadtxt() 函数读取数据,split() 函数切分数据
import numpy as np
def iris_type(s):
it = {b'Iris-setosa': 0, b'Iris-versicolor': 1, b'Iris-virginica': 2}
return it[s]
path = 'iris.data'
data = np.loadtxt(path, dtype=float, delimiter=',', converters={4: iris_type})
x, y = np.split(data, (4,), axis=1)
print('x=\n',x)
print('y=\n',y)
分析:
1)numpy.loadtxt() 函数:
-
dtype=float,以浮点数类型读取数据集
-
delimiter=’,’,以 ‘,’ 分隔符读取数据
-
converters={4: iris_type},对读取的数据进行预处理,自定义 iris_type() 函数,将第 4 列(从第 0 列开始)数据通过字典将各类鸢尾花映射为数字 0,1,2。
-
其余参数:
loadtxt(fname, dtype=<class ‘float’>, comments=’#’, delimiter=None, converters=None, skiprows=0, usecols=None, unpack=False, ndmin=0, encoding=‘bytes’)
- fname,文件路径
- comments,跳过comments参数开头的行(如 linux 系统的配置文件中用于说明的行一般用“#”开头,可用comments参数进行跳过)
- skiprows,跳过的行数
- usecols,指定读取的列
- unpack,选择是否将数据进行向量输出,默认False,即将数据逐行输出;设置为True时,数据将逐列输出
- encoding,读取文件使用的编码格式
2)numpy.split() 函数:
- (4,),切分位置,前 4 列为一组数据 x,其余为一组数组 y。
- axis=1,默认为0,横向切分;为1时,纵向切分。
3. Python 在字符串前加 ’u‘、‘r’、’b‘ 的作用
1)字符串前加 ’u‘
- 后面字符串以 Unicode 格式进行编码,一般用在中文字符串前面,防止乱码。
2)字符串前加 ‘r’
-
声明后面的字符串是普通字符串,防止特殊字符串自带功能生效,如 ’\n‘、’\t‘,一般用在正则表达式、文件路径中使用。
-
示例:
str1 = r'a\nb' print(str1)
a\nb
3)字符串前加 ’b‘
- ’b‘ 前缀代表 bytes(字节串),Python3 中默认 str(字符串)为Unicode 编码。