编程语言
首页 > 编程语言> > python中奇怪的“数组索引过多”错误

python中奇怪的“数组索引过多”错误

作者:互联网

让我们创建一个具有10,000个条目的大型np数组“ a”

import numpy as np
a = np.arange(0, 10000)

让我们对具有’n’索引0-> 9、1-> 10、2-> 11等的数组进行切片.

n = 32
b = list(map(lambda x:np.arange(x, x+10), np.arange(0, n)))
c = a[b]

我得到的奇怪的事情是,如果n小于32,则会出现错误“ IndexError:数组的索引过多”.如果n大于或等于32,则代码可以正常工作.不管初始数组的大小或单个切片的大小如何,都会发生错误,但始终为32.请注意,如果n == 1,则代码有效.

知道是什么原因造成的吗?谢谢.

解决方法:

您的b是一个数组列表:

In [84]: b = list(map(lambda x:np.arange(x, x+10), np.arange(0, 5)))            
In [85]: b                                                                      
Out[85]: 
[array([0, 1, 2, 3, 4, 5, 6, 7, 8, 9]),
 array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10]),
 array([ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11]),
 array([ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12]),
 array([ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13])]

当用作索引时:

In [86]: np.arange(1000)[b]                                                     
/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
---------------------------------------------------------------
IndexError: too many indices for array

A [1,2,3]与A [(1,2,3)]相同-也就是说,逗号分隔的索引是一个元组,然后将其传递给索引函数.换句话说,多维索引应该是一个元组(包括带有切片的元组).

到目前为止,numpy有点草率,并允许我们以相同的方式使用索引列表.该警告告诉我们,开发人员正在加强这些限制.

该错误意味着它试图将列表中的每个数组解释为一个单独维度的索引.一个数组最多可以有32个维.显然,对于较长的列表,它不会尝试将其视为元组,而是创建一个用于索引的2d数组.

我们可以使用多种方法使用b索引一个1d数组:

In [87]: np.arange(1000)[np.hstack(b)]                                          
Out[87]: 
array([ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9,  1,  2,  3,  4,  5,  6,  7,
        8,  9, 10,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11,  3,  4,  5,  6,
        7,  8,  9, 10, 11, 12,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13])

In [89]: np.arange(1000)[np.array(b)]    # or np.vstack(b)                                       
Out[89]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13]])

In [90]: np.arange(1000)[b,]             # 1d tuple containing b                                       
Out[90]: 
array([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9],
       [ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10],
       [ 2,  3,  4,  5,  6,  7,  8,  9, 10, 11],
       [ 3,  4,  5,  6,  7,  8,  9, 10, 11, 12],
       [ 4,  5,  6,  7,  8,  9, 10, 11, 12, 13]])

请注意,如果b是一个参差不齐的列表-一个或多个数组较短,则仅hstack版本有效.

标签:numpy-ndarray,index-error,python,numpy
来源: https://codeday.me/bug/20191024/1923065.html