genfromtxt 创建元组的一维数组而不是二维数组
genfromtxt creates 1D array of tuples instead of 2D array
我正在尝试使用 scikit-learn 进行一些分类。但是,我在开始工作和导入数据时遇到了问题。
我正在处理这些数据:Adult Data Set。
我是 numpy 和 scikit-learn 的新手,所以我开始关注 this tutorial, which uses the Wine dataset。
我遇到的问题是数据是作为元组的一维数组而不是二维数组导入的。 ?
.
表示也有缺失数据
我的数据集不完全是数字的。有很多字符串。我阅读了 genfromtxt doc,其中包含如何处理混合类型数据集的示例。 (可能有比我在下面使用的更好的方法来解决这个问题吗?)
这是我的代码:
import numpy as np
all_data = np.genfromtxt(open("./adult.data","r"), dtype=[
('age', 'i4'),
('workclass', 'S16'),
('fnlwgt', 'i8'),
('education', 'S12'),
('education_num', 'i4'),
('marital_status', 'S22'),
('occupation', 'S17'),
('relationship', 'S14'),
('race', 'S18'),
('sex', 'S6'),
('capital_gain', 'i8'),
('capital_loss', 'i8'),
('hours_per_week', 'i4'),
('native_country', 'S26'),
('income', 'S5')
],
delimiter=",", autostrip=True,
missing_values=('?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'))
# load class labels from column 15
y_adult_labels = all_data['income']
# load the 14 features
X_adult = all_data[:][0:-1]
这是创建一维元组数组,其中每个元组是原始 CSV 数据文件中的一行。
为什么这不是创建二维数组? (对于初学者来说,像这样的 all_data[:,1:]
给出了 IndexError: too many indices for array
。)
我最终想要:
- 将字符串数据映射到数值(不知何故......也许在
genfromtxt
调用中使用 converters
?
- 处理二维数组(例如 PCA)
二维数组必须在所有单元格中具有相同类型的内容。但是根据您自己的规范(dtype),您正在加载数字和字符串的混合。
这是一种不同类型的二维数组,一种结构化数组。您按编号索引 'rows',按名称索引 'columns',例如all_data['income']
。那些 'tuples'(不是真正的元组,但它们以这种方式显示)是相当于二维数组行的结构化数组。
如果您确实必须按编号访问字段,则从 dtype.names
列表中索引名称。
阅读结构化(有时称为记录)数组。
为什么genfromtxt
returns一维数组的问题已经被问过很多次了
至于转换为纯数值数据,我想你将不得不逐列(field)工作。制作另一个数组 newdata=np.empty((n,15),dtype=int)
。采用 all_data['workclass']
,将字符串映射到数字,并将它们分配给 newdata[:,1]=...
,等等。没有魔法或捷径。
我正在尝试使用 scikit-learn 进行一些分类。但是,我在开始工作和导入数据时遇到了问题。
我正在处理这些数据:Adult Data Set。
我是 numpy 和 scikit-learn 的新手,所以我开始关注 this tutorial, which uses the Wine dataset。
我遇到的问题是数据是作为元组的一维数组而不是二维数组导入的。 ?
.
我的数据集不完全是数字的。有很多字符串。我阅读了 genfromtxt doc,其中包含如何处理混合类型数据集的示例。 (可能有比我在下面使用的更好的方法来解决这个问题吗?)
这是我的代码:
import numpy as np
all_data = np.genfromtxt(open("./adult.data","r"), dtype=[
('age', 'i4'),
('workclass', 'S16'),
('fnlwgt', 'i8'),
('education', 'S12'),
('education_num', 'i4'),
('marital_status', 'S22'),
('occupation', 'S17'),
('relationship', 'S14'),
('race', 'S18'),
('sex', 'S6'),
('capital_gain', 'i8'),
('capital_loss', 'i8'),
('hours_per_week', 'i4'),
('native_country', 'S26'),
('income', 'S5')
],
delimiter=",", autostrip=True,
missing_values=('?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?', '?'))
# load class labels from column 15
y_adult_labels = all_data['income']
# load the 14 features
X_adult = all_data[:][0:-1]
这是创建一维元组数组,其中每个元组是原始 CSV 数据文件中的一行。
为什么这不是创建二维数组? (对于初学者来说,像这样的 all_data[:,1:]
给出了 IndexError: too many indices for array
。)
我最终想要:
- 将字符串数据映射到数值(不知何故......也许在
genfromtxt
调用中使用converters
? - 处理二维数组(例如 PCA)
二维数组必须在所有单元格中具有相同类型的内容。但是根据您自己的规范(dtype),您正在加载数字和字符串的混合。
这是一种不同类型的二维数组,一种结构化数组。您按编号索引 'rows',按名称索引 'columns',例如all_data['income']
。那些 'tuples'(不是真正的元组,但它们以这种方式显示)是相当于二维数组行的结构化数组。
如果您确实必须按编号访问字段,则从 dtype.names
列表中索引名称。
阅读结构化(有时称为记录)数组。
为什么genfromtxt
returns一维数组的问题已经被问过很多次了
至于转换为纯数值数据,我想你将不得不逐列(field)工作。制作另一个数组 newdata=np.empty((n,15),dtype=int)
。采用 all_data['workclass']
,将字符串映射到数字,并将它们分配给 newdata[:,1]=...
,等等。没有魔法或捷径。