这看起来真的很愚蠢,但我想知道为什么以下代码(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]
我可以理解,当我们想要参与一个数组时,我们可能并不关心索引是否变得太大(只是采用数组中的内容),但我似乎有点棘手:它很容易也没有注意到你实际上有一个但是在计算索引的方式上,没有异常提升。
答案 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]
[]
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