python - IndexError : too many indices for array. 具有 42 个特征的 Numpy 数组不均匀

标签 python arrays numpy scikit-learn classification

我正在尝试实例化我的分类测试集,加载具有 41 个特征和 1 个标签的数据集:

import numpy as np

f = open("mydataset")
dataset = np.genfromtxt(f, delimiter=',', dtype=None)

X = dataset[:, 0:40]  # select columns 1 through 41
y = dataset[:, 41]  # select column 42 (the labels)

由于 mydataset 不是同类的(并非所有元素都具有相同的类型),函数 genfromtxt 创建一个一维数组(元组列表)。所以我得到这个错误:

X = dataset[:, 0:40]  # select columns 1 through 41
IndexError: too many indices for array

我该如何解决这个问题?我是否必须以二维方式转换 numpy 数组(如果是,以哪种方式)?还是我必须使用另一种方法来选择正确的列?

谢谢

最佳答案

你可以定义一个复合数据类型:

dt = np.dtype([('values',float,(41,)),('labels','S10')])
data=np.genfromtxt(f, delimiters=',',dtype=dt)
X = data['values']
Y = data['labels']

(未测试,因为我没有这种大小的样本数组)。

正如我在最近的回答中所描述的那样,https://stackoverflow.com/a/37126091/901925 ,

您可以将 dtype=None 数据转换为此复合数据类型

data.view(dt)

尽管这要求所有数字都作为 float (或全部作为整数)加载。 CSV 通常混合使用 float 和整数列,因此 None genfromtxt 调用的数字字段将混合使用多种类型。

借用其他答案,一般的结构化数组可能如下所示:

In [421]: data=np.array([('label1', 12, 23.2, 232.0), ('label2', 23, 2324.0, 324.0),
       ('label3', 34, 123.0, 2141.0), ('label4', 0, 2.0, 3.0)], 
      dtype=[('f0', '<U10'), ('f1', '<i4'), ('f2', '<f8'), ('f3', '<f8')])

4 个不同数据类型的字段。

可以通过名称访问各个字段:data['f0'],或名称列表 data[['f0','f3']]。但是您可以使用名称列表执行的操作是有限的。

In [426]: data[['f2','f3']]=10
...
ValueError: multi-field assignment is not supported

如果你制作一个副本,你可以做更多的事情,如果你将它视为同构数组,你可以做更多的事情:

In [427]: d23=data[['f2','f3']].copy()

In [428]: d23
Out[428]: 
array([(23.2, 232.0), (2324.0, 324.0), (123.0, 2141.0), (2.0, 3.0)], 
      dtype=[('f2', '<f8'), ('f3', '<f8')])

In [429]: d23=d23.view((float,(2,)))

In [430]: d23
Out[430]: 
array([[  2.32000000e+01,   2.32000000e+02],
       [  2.32400000e+03,   3.24000000e+02],
       [  1.23000000e+02,   2.14100000e+03],
       [  2.00000000e+00,   3.00000000e+00]])

In [431]: d23+=34

In [432]: d23
Out[432]: 
array([[   57.2,   266. ],
       [ 2358. ,   358. ],
       [  157. ,  2175. ],
       [   36. ,    37. ]])

(对 d23 的更改不会影响原始 data)。

关于python - IndexError : too many indices for array. 具有 42 个特征的 Numpy 数组不均匀,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218031/

相关文章:

python - 通用代码的类型提示

python - 处理 float 参数python

javascript - 在从第一个表返回的条件或返回从 foreach 派生的数组中返回空对象值的位置上进行 Sequelize 连接

python - 如何检查 Pandas 中两个或多个重复值后的数据是否丢失并用以前的值替换丢失的值?

python - 将级联字典转换为列表列表

javascript - 检查是否显示了数组中的所有百分比

python:如何使用 ijson 库解析 json 数组流

python - pandas 将字符串列转换为日期时间,允许丢失但不无效

python - 根据形状对 numpy 数组列表进行分组。 Pandas ?

python - 为什么 XGBoost 拟合速度很慢,即使数据集非常小?