【问题标题】:Too many indices for array数组索引过多
【发布时间】:2015-10-26 11:12:12
【问题描述】:

我正在尝试根据对象提供给我的数据创建 3D 图像 mat1。但我收到最后一行的错误:mat1[x,y,z] = mat[x,y,z] + (R**2/U**2)**pf1[l,m,beta]:

IndexError: too many indices for array

这可能是什么问题?

以下是我的代码:

mat1 = np.zeros((1024,1024,360),dtype=np.int32)

k = 498
gamma = 0.00774267
R = 0.37
g = np.zeros(1024)
g[0:512] = np.linspace(0,1,512)
g[513:] = np.linspace(1,0,511)
pf = np.zeros((1024,1024,360))
pf1 = np.zeros((1024,1024,360))

for b in range(0,1023) :
  for beta in range(0,359) :
    for a in range(0,1023) :
      pf[a,b,beta] = (R/(((R**2)+(a**2)+(b**2))**0.5))*mat[a,b,beta]
    pf1[:,b,beta] = np.convolve(pf[:,b,beta],g,'same')

for x in range(0,1023) :
  for y in range(0,1023) :
    for z in range(0,359) :
        for beta in range(0,359) :
         a = R*((-x*0.005)*(sin(beta)) + (y*0.005)*(cos(beta)))/(R+    (x*0.005)*(cos(beta))+(y*0.005)*(sin(beta)))
          b = z*R/(R+(x*0.005)*(cos(beta))+(y*0.005)*(sin(beta)))
          U = R+(x*0.005)*(cos(beta))+(y*0.005)*(sin(beta))
          l = math.trunc(a)
          m = math.trunc(b)
          if (0<=l<1024 and 0<=m<1024) : 
              mat1[x,y,z] = mat[x,y,z] + (R**2/U**2)**pf1[l,m,beta]

【问题讨论】:

    标签: python numpy


    【解决方案1】:

    你执行convolution的那一行:

    pf1 = np.convolve(pf[:,b,beta],g)
    

    生成一个 1 维数组,而不是像您在最后一行中调用的 3 维数组:pf1[l,m,beta]

    要解决这个问题,您可以使用:

    pf1[:,b,beta] = np.convolve(pf[:,b,beta],g,'same')
    

    你还需要预定义pf1:

    pf1 = np.zeros((1024,1024,360))
    

    请注意,f*g (np.convole(f,g)) 的卷积通常返回 |f|+|g|-1 的长度。但是,如果您将 np.convolve 与参数 'same' 一起使用,它会返回一个最大长度为 f 或 g 的数组(即 max(|f|,|g|))。

    编辑: 此外,您必须确保矩阵的维度和您使用的索引是正确的,例如:

    您定义了mat1 = np.zeros((100,100,100),dtype=np.int32),因此是一个 100x100x100 矩阵,但在最后一行中您定义了mat1[x,y,z],其中变量 x、y 和 z 显然超出了这些维度。在这种情况下,它们会到达mat 矩阵的范围。可能您还必须将mat1 的尺寸更改为:

    mat1 = np.zeros((1024,1024,360),dtype=np.int32)
    

    还要确保您计算的最后一个变量索引(l 和 m)在 pf1 的维度内。

    编辑 2range(a,b) 函数返回一个从 a 到 b 的数组,但不包括 b。因此,例如,您应该写 range(0,1024)(或更短:range(1024)),而不是 range(0,1023)

    编辑 3:要检查 lm 是否超出尺寸,您可以在它们超出时立即添加错误:

          l = math.trunc(a)
          if l>=1024:
              print 'l exceeded bounds: ',l
          m = math.trunc(b)
          if m>=1024:
              print 'm exceeded bounds: ',m
    

    编辑 4:请注意您的代码,尤其是您的最后一个 for 将需要很长时间!您最后一次嵌套的结果为 1024*1024*360*360=135895449600 次迭代。我做了一个小的时间估计(计算你的 for 循环中代码的运行时间)你的代码可能需要大约 5 天才能运行。

    你可以做一个简单的优化,而不是多次计算 sin 和 cos,而是创建一个存储值的变量:

    sinbeta = sin(beta)
    cosbeta = cos(beta)
    

    但可能仍需要几天时间。您可能想检查如何优化计算或使用 C 程序进行计算。

    【讨论】:

    • 我试过 pf1[:,b,beta] = np.convolve(pf[:,b,beta],g) 但它仍然给出同样的错误。
    • 看答案,我改了。
    • 谢谢!我现在没有得到那个错误。但现在我得到 mat1[x,y,z] = mat[x,y,z] + (R2/U2)**pf1[l,m,beta] IndexError: index 1024对于大小为 1024 的轴 1 超出范围
    • 从错误中我了解到变量 l 的值 1024 超出范围,因为 pf1 的第一个维度是 1024 长(即索引从 0 到 1023)。
    • 即使我初始化 : for x in range(0,1025) 我得到同样的错误。
    猜你喜欢
    • 2020-09-26
    • 2016-09-06
    • 2016-05-03
    • 2018-05-23
    • 1970-01-01
    • 2019-07-17
    • 2020-09-14
    • 2018-06-12
    相关资源
    最近更新 更多