【问题标题】:Error: index 2 is out of bounds for axis 0 with size 2错误:索引 2 超出轴 0 的范围,大小为 2
【发布时间】:2021-03-18 16:56:38
【问题描述】:

这是我第一次来这里。抱歉,我对python很陌生。作为我大学课程的一部分,我正在尝试使用蒙特卡罗方法来计算 8D 积分。但是,当我运行程序时,当我定义 x0[i] 时,我得到了在线标题中描述的错误。它似乎只允许 i 最多运行 2,但我想调查错误,因为 N 是变化的,所以我需要能够使用 N>2。任何帮助将不胜感激

杰克

a=0          #Defining Limits of Integration 
b=np.pi/8
N=4    #Number of random numbers generated in each dimension

for i in range(N):
     x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
     x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x2rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x3rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x4rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x5rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x6rand[i]=((np.pi/8))*np.random.uniform(0,1)
     x7rand[i]=((np.pi/8))*np.random.uniform(0,1)

def func(x0,x1,x2,x3,x4,x5,x6,x7):  #Defining the integrand
    return (10**6)*np.sin(x0+x1+x2+x3+x4+x5+x6+x7)

integral = 0.0
for i in range(N):
integral += func(x0rand[i],x1rand[i],x2rand[i],x3rand[i],x4rand[i],x5rand[i],x6rand[i],x7rand[i])

answer=(((b-a)**8)/N)*integral
print ('The Integral is:', answer)

IndexError                                Traceback (most recent call last)
<ipython-input-141-1a3483405a4d> in <module>()
  4 
  5 for i in range(N):
  ----> 6   x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
  7   x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
  8   x2rand[i]=((np.pi/8))*np.random.uniform(0,1)

 IndexError: index 2 is out of bounds for axis 0 with size 2

【问题讨论】:

    标签: python debugging error-handling montecarlo indices


    【解决方案1】:

    发布的程序不是已运行的完整代码,否则您会收到消息NameError: name 'x0rand' is not defined。您之前必须定义和标注x0rand,并且尺寸为 2 而不是 N。

    适当地(重新)定义x0rand等,你可以把

    x0rand, x1rand, x2rand, x3rand, x4rand, x5rand, x6rand, x7rand = np.zeros((8, N))
    

    在循环之前。

    【讨论】:

    • 不想投反对票,但这个答案对于一个新的 Python 程序员来说会产生相当意想不到的行为。特别是,考虑到之后会出现一个循环,它会改变它的元素。更具体地说,x0rand, x1rand... 都是同一个列表!所以当你变异一个时,你会变异所有的。这种“意外”行为导致 OP (stackoverflow.com/questions/66704954/…) 提出以下问题。请考虑在您的答案中添加一些警告。
    • 感谢您的评论;你当然是完全正确的。但是,嘿,由于我的错误,提问者学到了一些新东西,我想起了我应该从一开始就想到的东西。 ;-) 我没有在我的错误答案中添加一些警告,而是更正了它。再次感谢!
    • 一点也不麻烦。更正答案显然是更好的方法。干杯!
    【解决方案2】:

    不幸的是这段代码不起作用,无论如何我建议使用 numpy 的力量:

    一些热门

    for i in range(N):
         x0rand[i]=((np.pi)/8)*np.random.uniform(0,1) #Generates N random numbers 8D between 0 and pi/8
         x1rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x2rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x3rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x4rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x5rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x6rand[i]=((np.pi/8))*np.random.uniform(0,1)
         x7rand[i]=((np.pi/8))*np.random.uniform(0,1)
    

    可以用矢量方式初始化,可以看size参数。

    xrand = np.random.uniform(0,1,size=(N,))
    

    函数本身可以变得更有效率。 调用它会更具可读性。

    def func(arr):  #Defining the integrand
        return (10**6)*np.sin(arr.sum())
    
    func(xrand)
    

    【讨论】:

      猜你喜欢
      • 2021-01-22
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-12
      相关资源
      最近更新 更多