genfromtxt创建的是由元组组成的一维数组而不是二维数组。

3

我正在尝试使用scikit-learn进行一些分类。然而,我在起步和导入数据方面遇到了麻烦。

我正在处理这个数据:成人数据集

我对numpy和scikit-learn都很陌生,所以我开始按照这个教程的步骤操作,该教程使用葡萄酒数据集

我的问题是数据被导入为一个由元组组成的1D数组,而不是2D数组。还有缺失的数据,用?表示。

我的数据集并不完全是数字。有很多字符串。我阅读了genfromtxt文档,其中有处理混合类型数据集的示例。(除了我下面使用的方法外,可能还有更好的方法吗?)

以下是我的代码:

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)
1个回答

4
一个二维数组中所有单元格必须具有相同类型的内容。但是,根据您自己的规定(dtype),您正在加载混合数字和字符串。
这是一种不同类型的二维数组,称为结构化数组。您按编号索引“行”,按名称索引“列”,例如all_data['income']。那些“元组”(实际上不是元组,但它们以这种方式显示)是结构化数组行的等效形式。
如果您真的必须按编号访问字段,则从dtype.names列表中索引名称。
阅读结构化(有时称为记录)数组的相关信息。
关于为什么genfromtxt返回1d数组的问题已经被问了很多次。
至于转换为纯数值数据,我认为您需要逐列(字段)处理。创建另一个数组newdata=np.empty((n,15),dtype=int)。取all_data['workclass'],将字符串映射到数字,并将其分配给newdata[:,1]=...等等。没有魔法或捷径。

感谢 hpaulj 将我引向正确的方向。 - Craigoh1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接