因此,我正在尝试对数组进行热编码,并且出现了此问题。每当我尝试执行代码时,都会说存在索引错误。我正在用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
答案 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文档。