IndexError:只有整数,切片(`:`),省略号(`...`),numpy.newaxis(`None`)和整数或布尔数组才是有效索引men2n

时间:2019-08-04 11:45:04

标签: python numpy

我收到此错误该如何解决此问题

def fprop(self, input_data, target_data):
    tmp = [(t, i) for i, t in enumerate(target_data)]
    z = zip(*tmp)  # unzipping trick !
    cost = np.sum(np.log(input_data[z]))
    if self.size_average:
        cost /= input_data.shape[1]

错误

cost = np.sum(np.log(input_data[z]))
IndexError: only integers, slices (`:`), ellipsis (`...`), numpy.newaxis (`None`) and integer or boolean arrays are valid indices

1 个答案:

答案 0 :(得分:0)

您应该告诉我们一些有关代码和数据的信息。是您写的还是别人的?它是新的还是在以前有用,可能是在其他情况下?什么是:

input_data, target_data

但是让我们做出一个合理的猜测,并逐步探索代码(这是您应该自己做的事情):

In [485]: alist = [1,3,0,2]                                                                                  
In [486]: tmp = [(t,i) for i,t in enumerate(alist)]                                                          
In [487]: tmp                                                                                                
Out[487]: [(1, 0), (3, 1), (0, 2), (2, 3)]
In [488]: z = zip(*tmp)                                                                                      
In [489]: z                                                                                                  
Out[489]: <zip at 0x7ff381d50188>

在Python 3中,zip生成zip对象,即生成器。显然,它不能作为任何内容的索引。

我们可以将其变成一个列表,这就是Python2要做的:

In [490]: list(z)                                                                                            
Out[490]: [(1, 3, 0, 2), (0, 1, 2, 3)]

但是该元组列表有些不错:

In [491]: x = np.arange(16).reshape(4,4)                                                                     
In [492]: x[_490]                                                                                            
/usr/local/bin/ipython3:1: FutureWarning: Using a non-tuple sequence for multidimensional indexing is deprecated; use `arr[tuple(seq)]` instead of `arr[seq]`. In the future this will be interpreted as an array index, `arr[np.array(seq)]`, which will result either in an error or a different result.
  #!/usr/bin/python3
Out[492]: array([ 4, 13,  2, 11])

如果我们将其转换为元组的元组,则numpy会在没有警告的情况下工作:

In [493]: x[tuple(_490)]                                                                                     
Out[493]: array([ 4, 13,  2, 11])

这与使用alist为每一列选择一个值相同:

In [494]: x[alist, np.arange(4)]                                                                             
Out[494]: array([ 4, 13,  2, 11])

In [495]: x                                                                                                  
Out[495]: 
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11],
       [12, 13, 14, 15]])

最初我应该将zip扩展为tuple

In [502]: x[tuple(zip(*tmp))]                                                                                
Out[502]: array([ 4, 13,  2, 11])

已经解决了这个问题,现在我怀疑这段代码最初适用于Python2。