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

时间:2015-04-13 03:08:10

标签: python numpy scipy

我试图使用scikit-learn做一些分类。但是,我很难立即开始并导入数据。

我正在处理这些数据:Adult Data Set

我是numpy和scikit-learn的新手,所以我开始关注使用this tutorialWine 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数据文件中的一行。

为什么这不会创建2D数组? (首先,像all_data[:,1:]这样的内容会产生IndexError: too many indices for array。)

我最终想:

  • 将字符串数据映射到数值(以某种方式......可能在converters调用中使用genfromtxt
  • 处理2D阵列(例如,PCA)

1 个答案:

答案 0 :(得分:3)

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

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

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

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

为什么genfromtxt返回1d数组的问题已被多次询问。

至于转换为纯数字数据,我认为你必须按列工作列(字段)。制作另一个数组newdata=np.empty((n,15),dtype=int)。取all_data['workclass'],将字符串映射到数字,然后将其分配给newdata[:,1]=...等。没有魔法或捷径。