如何确保and数组中的索引仅包含有效输入?

时间:2019-07-18 13:24:00

标签: python pandas

因此,我正在尝试对数组进行热编码,并且出现了此问题。每当我尝试执行代码时,都会说存在索引错误。我正在用google colaboratory进行编码。

我尝试使用双方括号来解决问题,但仍然没有解决办法

def read_dataset():
    df = pd.read_csv("sonar.all-data.csv")
    x = df[df.columns[0:60]].values
    y = df[df.columns[60]]
    encoder = LabelEncoder()
    encoder.fit(y)
    y = oneHotEncode(y)
    return(x, y)

def oneHotEncode(labels):
    n_labels = len(labels)
    n_unique_labels = len(np.unique(labels))
    oneHE = np.zeros((n_labels, n_unique_labels))
    oneHE[np.arange(n_labels), labels] = 1
    return oneHE

期望的输出是一个数组x和一个带有所有因变量的数组y,所有的自变量都是一个热编码的。但是显示了以下错误消息:

IndexError Traceback
oneHE[np.arange(n_labels), labels] = 1 

IndexError: only integers, slices (`:`), ellipsis (`...`),    numpy.newaxis (`None`) and integer or boolean arrays are valid indices

3 个答案:

答案 0 :(得分:0)

相反,我会遍历您想要的范围。嵌套列表用List[x][y]而不是List[x,y]引用。

您要说的索引应等于1。np.arange(n_labels), labels。是您想要的,还是忘记了将它们作为函数的参数?

您现在正在做什么等同于

import numpy as np
a = [1,2,3,4,5]
a[np.arange(5), [1,2,3,4,5]] = 1

但是表达式np.arange(5), [1,2,3,4,5]的计算结果为(array([0, 1, 2, 3, 4]), [1, 2, 3, 4, 5]),因此您要使用的索引是数组和列表的元组。

答案 1 :(得分:0)

将来,最好将您的进口商品包括在内,以提高清晰度。

我这样做了:

x = df[df.columns[0:max(df.__len__(), 60)]].values
y = df[df.columns[0:max(df.__len__(), 60)]]

使用__len__应该可以避免出现索引问题。我不确定您的csv文件大小是多少,但最大arg为60可能不是必需的。

答案 2 :(得分:0)

我可以通过以下方式重现您的错误:

In [1]: labels = ['one','two']                                                                               
In [2]: arr = np.zeros((2,2))                                                                                
In [3]: arr[np.arange(2), labels]                                                                            
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-3-957dfbe132f5> in <module>
----> 1 arr[np.arange(2), labels]

IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

我的猜测是您的labels列表或数组是字符串。

如果我在正确的范围内提供一个整数数组(或列表),则可以建立索引:

In [5]: arr[np.arange(2), [0,1]]                                                                             
Out[5]: array([0., 0.])

通常,我们不会事先测试索引的有效性。相反,我们使用它们并从错误中学习。此错误消息枚举numpy数组的索引的有效类型。如果需要更多详细信息,请研究numpy文档。