Индекс 60 выходит за пределы для оси 0 с размером 60 - PullRequest
0 голосов
/ 05 июня 2019

У меня проблема с моим кодом, и независимо от того, что я делаю, я всегда получаю ошибку индекса за пределами границ

Я пытался изменить 60 на 40 или 80, но у меня всегда одна и та же проблема

def Talus(Nbriter,taille):
M=np.zeros([taille,taille],int)
avalanch=[]
duree=[]
perte=[]
for gain in range(Nbriter):
    iaj=rd.randint(1,taille-1)
    jaj=rd.randint(1,taille-1)
    M[iaj][jaj]+=1
    a=1
    atot=0
    d=0
    perdu=0
    while a>0:
        for i in range(1,taille-1):
            for j in range(1,taille-1):
                if (M[i][j]-M[i][j+1]>3) or (M[i][j]-M[i][j-1]>3) or (M[i] 
                    [j]-M[i+1][j]>3) or (M[i][j]-M[i-1][j]>3):
                    M[i][j]-=4
                    M[i][j+1]+=1
                    M[i][j-1]+=1
                    M[i+1][j]+=1
                    M[i-1][j]+=1
                    a+=4
                    d+=1
                else:
                    a=0
                atot+=a
                for i in range(taille):
                    perdu+=M[i][0]
                    M[i][0]=0
                    perdu+=M[i][-1]
                    M[i][-1]=0
                for j in range(taille):
                    perdu+=M[0][j]
                    M[0][j]=0
                    perdu+=M[-1][j]
                    M[-1][j]=0

            avalanch.append(atot)
            duree.append(d)
            perte.append(perdu)
        return(M,avalanch,duree,perte)


     M,avalanch,duree,perte=Talus(100000,40)

Я всегда получаю это:

Traceback (most recent call last):
  File "C:\Users\Poste1\Desktop\mon tipe\codeavalanche2.py", line 52, in 
  <module>
   M,avalanch,duree,perte=Talus(100000,40)
   File "C:\Users\Poste1\Desktop\mon tipe\codeavalanche2.py", line 26, 
   in Talus
       if (M[i][j]-M[i][j+1]>3) or (M[i][j]-M[i][j-1]>3) or (M[i][j]- 
    M[i+1][j]>3) or (M[i][j]-M[i-1][j]>3):
     IndexError: index 40 is out of bounds for axis 0 with size 40

Это проект, который мне нужно представить, поэтому, если кто-нибудь знает, как я могу это исправить, я был бы очень признателен.Спасибо

Кстати, мой профессор сказал мне изменить диапазон на xrange, но я использую python 3, чтобы он не существовал.

1 Ответ

0 голосов
/ 05 июня 2019

Поправьте меня, если я ошибаюсь, но я думаю, что у вас есть какая-то проблема с пониманием того, как индексы массивов работают в программировании, поскольку Python использует классический тип записи 0 to (size-1).Позвольте мне объяснить:

Я думаю, что ваша проблема в том, что индекс, к которому вы пытаетесь получить доступ, относится к размеру массива.То есть вы используете taille для размера и j, что на последней итерации будет j = taille-1.Здесь возникает проблема, поскольку ваш массив всегда будет иметь заданный размер, определяемый как taille, скажем, taille = 5, а затем на последней итерации j, (j+1) = (taille-1)+1 = taille = 5 => M[5] -> ERROR.

Ошибка вполне разумна, так как индексы массива работают следующим образом:

Element 1, Element 2, Element 3, Element 4, Element 5.
Index   0, Index   1, Index   2, Index   3, Index   4.

Или, как я сказал в начале, индексы идут from 0 to (size-1), и это означает, что вы не можете получить доступtaille-th элемент массива размером taille.

Что касается решения вашей проблемы, если вы действительно хотите получить доступ к i+1 и j+1, вам следует изменить пределы вашего for цикл от (1, taille-1) до (1, taille-2) в обоих случаях.

Надеюсь, вы нашли мой ответ полезным:)

...