2017-01-26 4 views
1

Es scheint wirklich dumm, aber ich frage mich, warum der folgende Code (numpy 1.11.2) eine Ausnahme auslösen:numpy: Indizes zu groß Geben manchmal Ausnahmen, manchmal nicht

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

Ein nicht dieses:

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

kann ich verstehen, wenn wir Teil eines Arrays nehmen wollen, das ist möglich, dass wir, wenn der Index zu groß wird (nur nehmen, was in dem Array ist), aber es scheint ein wenig nicht wirklich interessieren tricky zu mir: es ist ziemlich einfach auch nicht bemerkt, dass Sie tatsächlich eine haben, aber auf dem Weg zählen Sie Indizes, ohne eine Ausnahmeerhöhung.

Antwort

1

Dies ist konsistent mit wie Python Listen (oder Sequenzen im Allgemeinen) verhalten:

>>> 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. Sie können keinen Index zugreifen, die nicht beendet hat.
  2. Sie können jedoch einen leeren Bereich haben, d. H. Eine leere Liste oder ein leeres NumPy-Array. Wenn also einer der Indizes außerhalb der Größe der Sequenz liegt, nimm, was da ist.

Die Python tutorial verwendet eine positivere Formulierung:

jedoch Scheibe Indizes außerhalb des zulässigen Bereichs elegant behandelt werden, wenn zum Schneiden verwendet:

0

In Python, die Zählung beginnt bei 0.

In Ihrem ersten Beispiel Array 10 Elemente hat, aber von 0 bis 9. Daher indiziert ist, ruft a[10], versuchen Sie das 11. Element zu nennen, die geben Sie haben einen Fehler außerhalb des gültigen Index für Ihr Array.

Wie folgt:

A = np.arange(0,10) 

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

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

Sie können hier über Python 0 Indizierung lesen: https://docs.scipy.org/doc/numpy-1.10.0/user/basics.indexing.html

1

Wenn Sie den Index 1:100 geben, verwenden Sie schneiden. Python akzeptiert im Allgemeinen Slices, die größer als die Liste sind, und ignoriert die verbleibenden Elemente, sodass es kein Problem gibt. Jedoch, wenn x[10], beziehen Sie sich speziell auf das 11. Element (erinnern Sie sich, dass Listen beginnen bei 0), die nicht existiert, so erhalten Sie eine Ausnahme

Verwandte Themen