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

时间:2019-02-28 16:49:50

标签: python numpy numpy-ndarray index-error

让我们创建一个具有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,则代码有效。

是什么原因引起的?谢谢。

2 个答案:

答案 0 :(得分:2)

首先,您切片0-> 9、10-> 19、20-> 29;您的切片仅前进1:0-> 9、1-> 10、11-> 20。相反,请尝试以下操作:

n = 32
size = 10
b = list(map(lambda x:np.arange(x, x+size), np.arange(0, n*size, size)))

接下来,您滥用了索引符号。 b是一个数组列表,您已使用此 entire 列表来索引a。当索引的元素数多于a中的元素数时,numpy假定您希望将复杂列表作为一个引用序列,并将它们用作单独的索引数组,每个a元素b中的叶子元素。

但是,一旦下降到len(a)的限制以下,则numpy假定您试图将多维切片放入a中:{{1的每个元素}}被当作b的相应维度的一部分。由于a仅是一维的,因此您会收到错误消息。您的代码将在a下以这种模式运行,但在n=1及更高版本下将失败。

尽管您的问题不是重复的,但也请参见this one

答案 1 :(得分:2)

您的this.$vuetify.lang.current = 'en-US'; 是一个数组列表:

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)]有点草率,并允许我们以相同的方式使用索引列表。该警告告诉我们,开发人员正在加强这些限制。

该错误表示它正在尝试将列表中的每个数组解释为单独维度的索引。一个数组最多可以有32个维。显然,对于较长的列表,它不会尝试将其视为元组,而是创建一个二维数组以进行索引。

我们可以使用多种方法numpy来索引一维数组:

b

请注意,如果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版本有效。