【问题标题】:Python/NumPy: IndexError in matrix with enough sizePython / NumPy:矩阵中的IndexError具有足够的大小
【发布时间】:2018-09-18 15:06:40
【问题描述】:

我正在尝试在 NumPy 中创建一个混淆矩阵,因此我初始化了一个零填充矩阵,其大小为 n x nn 我的分类器中的类数。

之后,我遍历每个输出(可以是单词、数字或其他任何内容,但包含在 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 类 arrayzeros

另外,让我更加困惑的是,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


【解决方案1】:

我的 repo 太低,无法评论,因此在这里写... 在您的情况下, conf_matrix 似乎是合法的,但是索引 i 和 j 到达它的方式非常复杂。原因可能是:

  1. i/j 超出限制:(打印消息似乎没有)
  2. i 的数据类型不是 int: 尽管 print cmd 正在打印 i,但仍然检查它是否未列出等。 我在下面的 cmd 提示符下做了一个简短的 exp。如果数据类型等存在一些潜在问题,通常索引错误的大小为 1:

conf_matrix[0][1] 1 conf_matrix[[0]][1] Traceback (most recent call last): File "<stdin>", line 1, in <module> IndexError: index 1 is out of bounds for axis 0 with size 1

如果是这种情况,请告诉我们。 如果我是你,我会检查索引器是否喷出正确的索引供我使用,以确保它在任何情况下都没有给出范围或有趣的东西。

我还将删除“conf_matrix[i][j] += 1”这一行并运行下面的 for 循环以查看是否所有 k,obt & i,j 对产生 请分享 o/p

【讨论】:

  • 确实问题是 2,i 和 j 不是 int 类型,indexador 输出的是数组,而不是数字。有点生气自己没有早点看到它。
【解决方案2】:

我发现了问题!

i = indexador[self.clases__ == obt]
j = indexador[self.clases__ == Y[k]]

使用此代码,ij 实际上是形状为 (1,) 的数组,我将它们当作简单的标量使用。

如果有人发现相同的问题,将这些行更改为:

i = indexador[self.clases__ == obt][0]
j = indexador[self.clases__ == Y[k]][0]

这样您就可以将形状为(1,) 的数组中的数字作为 i 和 j 来抓取,而不是整个数组。

【讨论】:

    猜你喜欢
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-11
    • 2022-01-06
    • 1970-01-01
    • 2017-10-08
    • 2013-03-15
    相关资源
    最近更新 更多