让我们创建一个具有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,则代码有效。
是什么原因引起的?谢谢。
答案 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
版本有效。