数组的索引太多了

时间:2015-10-26 11:12:13

标签: python numpy

我正在尝试根据对象提供给我的数据创建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]

1 个答案:

答案 0 :(得分:1)

执行convolution的行:

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

生成一维数组,而不是最后一行中的三维数组: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的维度内。

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

修改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程序计算它。