【发布时间】:2018-09-18 15:06:40
【问题描述】:
我正在尝试在 NumPy 中创建一个混淆矩阵,因此我初始化了一个零填充矩阵,其大小为 n x n 为 n 我的分类器中的类数。
之后,我遍历每个输出(可以是单词、数字或其他任何内容,但包含在 self.clases__ 中),获取与真实标签和输出相对应的分类集中的索引,然后尝试将该位置的值增加 1。
这会导致IndexError 异常,这是一个简单示例的输出:
In[99]: e.score([[0.1,0.5,0.7,0.8],[0.4,0.5,0.1,0.1,0.9],[0.1,0.9],
[0.1,0.5,0.8,0.2,0.9]],['Clase 1','Clase 2','Clase 2','Clase 1'])
Clase 1 -> 0
Clase 1 -> 0
(2, 2)
Clase 1 -> 0
Clase 2 -> 1
(2, 2)
Traceback (most recent call last):
File "<ipython-input-99-2b9291b14506>", line 2, in <module>
e.score([[0.1,0.5,0.7,0.8],[0.4,0.5,0.1,0.1,0.9],[0.1,0.9],
[0.1,0.5,0.8,0.2,0.9]],['Clase 1','Clase 2','Clase 2','Clase 1'])
File "redes.py", line 156, in score
conf_matrix[i][j] += 1
IndexError: index 1 is out of bounds for axis 0 with size 1
代码如下:
def score(self,X,Y):
salidas_obtenidas = self.clasifica(X)
conf_matrix = zeros((len(self.clases__),len(self.clases__)),dtype=int)
indexador = array(range(0,len(self.clases__)))
for k,obt in enumerate(salidas_obtenidas):
i = indexador[self.clases__ == obt]
j = indexador[self.clases__ == Y[k]]
print("%s -> %d" % (obt,i))
print("%s -> %d" % (Y[k],j))
print(conf_matrix.shape)
conf_matrix[i][j] += 1
return conf_matrix
让我难过的是,打印出来的形状显然大到可以被索引,但它引发了异常。我使用 numpy 类 array 和 zeros。
另外,让我更加困惑的是,conf_matrix 不会更新,如果我在执行的任何时候打印它,它只会打印一个零填充矩阵,即使在它引发异常之前,它也应该有至少有一个位置有 1。
这让我怀疑它实际上并没有访问真正的矩阵,但我不知道为什么它不会。
我使用的是 numpy 版本 1.14.2 和 Python 3.6。
感谢任何帮助!
编辑
我添加了一些代码,希望有人可以在不需要其余代码的情况下重现错误:
import numpy as np
salidas_obtenidas = np.array(['Clase 1', 'Clase 2', 'Clase 1', 'Clase 2'])
salidas_obtenidas = salidas_obtenidas.reshape(len(salidas_obtenidas),1)
clases = np.array(['Clase 1','Clase 2'],dtype='<U7')
Y = ['Clase 1','Clase 2','Clase 2','Clase 1']
conf_matrix = np.zeros((len(clases),len(clases)),dtype=int)
indexador = np.array(range(0,len(clases)))
for k,obt in enumerate(salidas_obtenidas):
i = indexador[clases == obt]
j = indexador[clases == Y[k]]
print("%s -> %d" % (obt,i))
print("%s -> %d" % (Y[k],j))
print(conf_matrix.shape)
conf_matrix[i][j] += 1
print(conf_matrix)
【问题讨论】:
-
我也不明白这个错误,我无法在我的电脑上重现它,因为我没有所有的代码。我可以告诉你我会怎么做。我使用 PyCharm 作为 IDE,它有一个很棒的调试选项。您可以设置一个断点,执行将停止,您将能够准确地看到所有变量的程序状态并对其进行各种操作。如果您还没有,我建议您尝试一下。你可以在这里找到 PyCharm 社区版,免费和开源:jetbrains.com/pycharm/download。免责声明:我没有以任何方式连接到 PyCharm。
-
@GianlucaMicchi 我将准备一些示例代码以提高生产力。感谢您的建议,我自己也在使用 Spyder,我确信它也有一个调试选项。我会尽快试试,谢谢。
标签: python python-3.x numpy matrix indexing