2013-07-23 2 views
1

Вторая половина дня. В настоящее время я переношу код IDL на python, и до сих пор он проплывал до этого момента. Я застрял на этом участке IDL кода:Портирование IDL-кода, функции lindgen для Python

nsteps = 266  
ind2 = ((lindgen(nsteps+1,nsteps+1)) mod (nsteps+1)) 
dk2 = (k2arr((ind2+1) < nsteps) - k2arr(ind2-1) > 0))/2. 

Моя версия этого включает в себя функцию переписан lindgen следующим образом:

def pylindgen(shape): 
    nelem = numpy.prod(numpy.array(shape)) 
    out = numpy.arange(nelem,dtype=int) 
    return numpy.reshape(out,shape) 

... и перенесенного кода, где k2arr является массивом форма (267,):

ind2 = pylindgen((nsteps+1,nsteps+1)) % (nsteps+1) 
dk2 = (k2arr[ (ind2+1) < nsteps ] - k2arr[ (ind2-1) > 0. ])/2. 

Теперь проблема в том, что мой код делает ind2 массив, где, глядя на код IDL и ошибки, возникающие в сценарии питона, я уверен, что он имел в виду, что скаляр. Не хватает ли какой-либо функции этих функций IDL?

Любые мысли были бы весьма благодарны. Cheers.

+0

По определению в pylindgen() ind2 представляет собой массив numpy, поэтому я не думаю, что мне нужно определить его как один снова. –

+0

Пожалуйста, разместите ошибки Python, которые вы видите. В коде IDL 'ind2' - это массив, в котором операция mod была применена по элементам. Код Python, который вы даете для выполнения того же действия, корректен для применения 'mod' к NumPy' ndarray'. Ошибка должна исходить из другой части вашего кода. – ely

+0

См. Jblasco ниже, чтобы узнать об ошибке. Спасибо за ответ! –

ответ

0

Мое знание IDL не так, как раньше, мне пришлось немного исследовать. Оператор «>» в ​​IDL не является эквивалентом python (или других языков). Он устанавливает максимум, все, что выше его, будет установлено на это значение. То же самое касается «<», очевидно, он устанавливает минимум.

dk2 = (k2arr ((ind2 + 1) < nsteps) - k2arr (ind2-1)> 0)), где k2arr 266 и ind2 есть (266266) эквивалентно говоря:

- (ind2+1 < nsteps) take ind2+1 and, in any place that ind2+1 
    is greater than nsteps, replace by nsteps. 
- (ind2-1 > 0) take ind2-1 and, in any place that ind2-1 is 
    less than zero, put zero instead. 

Трудная часть сейчас. k2arr (266) оценивается для каждой из строк (ind2 + 1) и (ind2-1), что означает, что if (ind2 + 1 < nsteps) = [1,2,3, ..., nsteps-1 , nsteps, nsteps] k2arr будет оцениваться точно в 266 раз, один поверх другого, в результате получается массив (266,266).

И ТЕПЕРЬ Я помню, почему я перестал программировать в IDL!

+0

О, черт возьми. Оператор был единственным, на что я не смотрел, поскольку он был настолько укоренился во мне, что это означает LT/GT. Я реализую это завтра и дам вам знать результат. Спасибо! –

0

Код для pylindgen отлично работает для меня. Выдает массив из (267,267). ЕСЛИ k2array является (267,) массивом, вы должны быть получаете сообщение об ошибке, как:

ValueError: логический массив индекса должен иметь 1 размер

Это ваша проблема? Cheers

+0

Да, это ошибка, которая производится. –

+0

Из этого, кажется, вы пытаетесь проиндексировать одномерный объект 'k2arr', используя двумерный (или более) индексный блок' ind2'. Вы должны убедиться, что ваш индексный набор имеет соответствующую форму как массив, на который вы хотите индексировать. – ely

+0

Я вижу. Имея мои ограниченные знания IDL, похоже, что код IDL делает это! Очевидно, это не может быть правдой. Я рассмотрю эту линию расследования. Спасибо @EMS. Очень признателен. –

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