索引60超出尺寸60的轴0的范围

时间:2019-06-05 16:49:04

标签: python-3.x indexing indexoutofboundsexception

我的代码有问题,无论我做什么,我总是使索引超出范围错误

我尝试将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 :(得分:0)

如果我错了,请纠正我,但是我认为您在理解数组索引在编程中的工作方式时遇到了一些问题,因为Python使用了经典的0 to (size-1)类型的表示法。让我自己解释一下:

我认为您的问题是您尝试访问的索引相对于数组的大小。也就是说,您使用taille作为大小,使用j,在上一次迭代中将使用j = taille-1。问题来了,因为您的数组总是具有给定的大小,由taille决定,例如taille = 5,然后在j的最后一次迭代中,{{1 }} => (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)的{​​{1}}元素。

关于解决问题的方法,如果您确实要访问taille-thtaille,则应将i+1循环的限制从j+1更改为在两种情况下均为for

希望您发现我的回答有用:)