2017-01-26 3 views
1

それは本当に愚かなようだが、次のコード(numpyの1.11.2)は例外を発生させ、なぜ私は思ったんだけど:numpyの:時には例外を与える大きすぎるインデックス、ない

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

アンではない、この1:私が理解することができます

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

、我々は、配列の一部を取りたいとき、それが可能だインデックスが(ちょうど配列であるものを取って)大きすぎるなれば、私たちは本当に気にしないが、それは少し思えますトリッキーすぎる私:それはあなたが実際に持っている気づいていないが、あなたがインデックスを数えている方法で、例外は発生しません。 Pythonで

答えて

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配列を持つことができます。 インデックスの1つがシーケンスのサイズの外にある場合、そこにあるものを取る。

    :スライスのために使用される場合

    しかし、範囲外のスライスインデックスが正常に処理される:

Python tutorialより肯定表現を使用します

0

、カウントはa[10]を呼び出して、あなたの配列は、10個の要素を持っていますが、そのため0から9までのインデックスが作成され、あなたの最初の例では0

から始まり、あなたが与えるであろう、11の要素を呼び出そうとします配列の有効なインデックスの外にエラーがあります。

は、次のように:

A = np.arange(0,10) 

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

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

あなたは0インデックスここのPythonについて読むことができます:あなたは、インデックス1:100を与えるとき https://docs.scipy.org/doc/numpy-1.10.0/user/basics.indexing.html

1

は、あなたがをスライスを使用しています。 Pythonは一般的に、リストよりも大きなスライスを受け取り、残りの項目を無視するので、問題はありません。しかし、x[10]の場合は、特に11番目の要素を参照してください(リストは0から始まることに注意してください)。これは存在しないため、例外が発生します。

関連する問題