我正在尝试根据对象提供给我的数据创建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]
答案 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 :要检查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
代码需要很长时间!您最后一次嵌套的结果是1024 * 1024 * 360 * 360 = 135895449600次迭代。我做了一个小的时间估计(计算你的for循环中的代码的运行时间),你的代码可能需要大约5天才能运行。
你可以做的一个简单的简单优化是多次计算sin和cos,创建一个存储值的变量:
sinbeta = sin(beta)
cosbeta = cos(beta)
但可能还需要几天时间。您可能想要检查如何优化计算或使用C程序计算它。