2015-10-26 3 views
1

Я пытаюсь создать трехмерное изображение 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

линия, где вы делаете 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)) 

Обратите внимание, что свертка ф * г (np.convole(f,g)) возвращает обычно длину | F | + | г | -1. Если вы, однако, используете np.convolve с параметром 'same', он возвращает массив, который имеет максимальную длину f или g (т. Е. max (| f |, | g |)).

Edit: Кроме того, вы должны быть уверены в том, что размеры матриц и индексы, которые вы используете правильные, например:

Вы определяете 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) 

быть также уверен, что последние переменные показатели вы расчет (л и м) находятся в пределах размеров pf1.

Редактировать 2: Функция range(a,b) возвращает массив от a до b, но не включает b. Например, вместо range(0,1023) вы должны написать range(0,1024) (или более короткое: range(1024)).

Edit 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 

Edit 4: обратите внимание, что ваш код, особенно ваш последний for займет много времени! Ваш последний вложенный результат для результатов в 1024 * 1024 * 360 * 360 = 135895449600 итераций. С небольшой оценкой времени, которую я сделал (расчет времени выполнения кода в вашем цикле for), вашему коду может потребоваться около 5 дней для запуска.

Небольшой простой оптимизации вы могли бы сделать это вместо того чтобы вычислять грех и потому несколько раз, создать переменную, хранящую значение:

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

, но это, вероятно, все-таки занять несколько дней. Вы можете проверить, как оптимизировать вычисления или рассчитать его с помощью программы на языке C, например.

+0

Я пробовал pf1 [:, b, beta] = np.convolve (pf [:, b, beta], g), но он по-прежнему дает ту же ошибку. –

+0

См. Ответ, я изменил его. – agold

+0

Спасибо! Я не получаю эту ошибку сейчас. Но теперь я получаю mat1 [x, y, z] = mat [x, y, z] + (R ** 2/U ** 2) ** pf1 [l, m, beta] IndexError: индекс 1024 is за пределы для оси 1 с размером 1024 –

Смежные вопросы