numpy:索引太大,有时会出现异常,有时则不然

时间:2017-01-26 11:19:11

标签: python arrays numpy indexing

这看起来真的很愚蠢,但我想知道为什么以下代码(numpy 1.11.2)引发异常:

import numpy as npy
a = npy.arange(0,10)
a[10]

不是这一个:

import numpy as npy
a = npy.arange(0,10)
a[1:100]

我可以理解,当我们想要参与一个数组时,我们可能并不关心索引是否变得太大(只是采用数组中的内容),但我似乎有点棘手:它很容易也没有注意到你实际上有一个但是在计算索引的方式上,没有异常提升。

3 个答案:

答案 0 :(得分:1)

当您提供索引1:100时,您使用切片。通常,Python接受大于列表的切片,并忽略剩余的项目,因此没有问题。但是,当x[10]时,您具体引用第11个元素(请记住列表从0开始),这个元素不存在,因此您得到异常

答案 1 :(得分:1)

这与Python列表(或一般序列)的行为方式一致:

>>> L = list(range(10))
>>> L[10]
IndexError 
...
IndexError: list index out of range
>>> L[1:100]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> L[100:100]
[]
  1. 您无法访问未退出的索引。
  2. 但是你可以有一个空范围,即空列表或空NumPy数组。 因此,当其中一个指数超出序列大小时,请选择那里的指标。
  3. Python tutorial使用更积极的措辞:

      

    但是,当用于切片时,超出范围切片索引会正常处理:

答案 2 :(得分:0)

在Python中,Counting从0开始。

在你的第一个例子中,你的数组有10个元素,但是从0到9的索引。因此,调用a[10],你试图调用第11个元素,这将给你一个错误,因为它在有效之外你的数组的索引。

如下:

A = np.arange(0,10)

A = [0,1,2,3,4,5,6,7,8,9]

len(A) = 10
A[9] = 9

您可以在此处阅读有关Python 0索引的内容: https://docs.scipy.org/doc/numpy-1.10.0/user/basics.indexing.html