Python 数组的索引太多

Python 数组的索引太多,python,numpy,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(

我试图从一个对象提供给我的数据创建一个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]
mat1=np.zero((10241024360),dtype=np.int32)
k=498
伽马=0.00774267
R=0.37
g=np.0(1024)
g[0:512]=np.linspace(0,1512)
g[513:=np.linspace(1,0511)
pf=np.零((10241024360))
pf1=np.零((10241024360))
对于范围(01023)内的b:
对于范围内的beta(0359):
对于范围(01023)内的a:
pf[a,b,beta]=(R/((R**2)+(a**2)+(b**2))**0.5))*mat[a,b,beta]
pf1[:,b,beta]=np.卷积(pf[:,b,beta],g,'same')
对于范围(01023)内的x:
对于范围(01023)内的y:
对于范围(0359)内的z:
对于范围内的beta(0359):
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=数学真值(b)
如果(0执行以下操作的线:

生成一维数组,而不是最后一行中调用的三维数组:
pf1[l,m,beta]

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

pf1[:,b,beta] = np.convolve(pf[:,b,beta],g,'same')
您还需要预定义pf1:

pf1 = np.zeros((1024,1024,360))
请注意,f*g的卷积(
np.convale(f,g)
)通常返回的长度为| f |+| g |-1。但是,如果与参数
“same”
一起使用,则返回的数组的最大长度为f或g(即max(| f |,| g |))

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

您定义了
mat1=np.zero((100100100),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:该函数返回从a到b的数组,但不包括b。因此,您应该编写
范围(01024)
(或更短:
范围(1024)
)而不是
范围(01023)

编辑3:要检查
l
m
是否超出尺寸,可以在超出尺寸后立即添加错误:

      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
将花费很长时间!您上次的嵌套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]索引器:索引1024超出轴1的范围,大小为1024。根据错误,我了解变量
l
得到值1024,该值超出范围,因为
pf1
的第一维度长度为1024(即索引0到1023)。即使在初始化时:对于范围(01025)内的x,我也会得到相同的错误。
sinbeta = sin(beta)
cosbeta = cos(beta)