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。)

我最终想要:

二维数组必须在所有单元格中具有相同类型的内容。但是根据您自己的规范(dtype),您正在加载数字和字符串的混合。

这是一种不同类型的二维数组,一种结构化数组。您按编号索引 'rows',按名称索引 'columns',例如all_data['income']。那些 'tuples'(不是真正的元组,但它们以这种方式显示)是相当于二维数组行的结构化数组。

如果您确实必须按编号访问字段,则从 dtype.names 列表中索引名称。

阅读结构化(有时称为记录)数组。

为什么genfromtxt returns一维数组的问题已经被问过很多次了

至于转换为纯数值数据,我想你将不得不逐列(field)工作。制作另一个数组 newdata=np.empty((n,15),dtype=int)。采用 all_data['workclass'],将字符串映射到数字,并将它们分配给 newdata[:,1]=...,等等。没有魔法或捷径。