2012-04-16 3 views
2

Я пытаюсь numpy, портируя некоторый код, который я написал в matlab/октаве. В Matlab я могу определить эквивалент кусочка python, а затем увеличивать его по мере необходимости. Например, в моем MatLab коде естьМожете ли вы увеличить фрагмент в python?

HXx_range = 1:NHXx; 
HXy_range = 1:NHXy; 

blah blah blah 

Hx(HXx_range, HXy_range) = Da(Hx_media(HXx_range, HXy_range)).*Hx(HXx_range, HXy_range) + Db(Hx_media(HXx_range, HXy_range)).*(Ez(HXx_range,HXy_range) - Ez(HXx_range,**HXy_range+1**)); 
Hy(HYx_range, HYy_range) = Da(Hy_media(HYx_range, HYy_range)).*Hy(HYx_range, HYy_range) + Db(Hy_media(HYx_range, HYy_range)).*(Ez(**HYx_range+1**,HYy_range) - Ez(HYx_range,HYy_range)); 
Ez(EZx_range, EZy_range) = Ca(Ez_media(EZx_range, EZy_range)).*Ez(EZx_range, EZy_range) + Cb(Ez_media(EZx_range, EZy_range)).*(Hy(EZx_range,EZy_range) - Hy(**EZx_range-1**,EZy_range) + Hx(EZx_range,**EZy_range-1**) - Hx(EZx_range,EZy_range)); 

Термины в '**' s (например, 'HXy_range + 1') являются они ключевые части; HXy_range + 1 равно 2: (NHXy + 1). В Python, я могу определить кусочек подобным образом:

HXx_range = slice(0, NHXx) 

Однако HXx_range + 1 дает мне ошибку. Конечно, я могу просто сделать для этого новый кусочек, но это не так чисто. Есть ли способ обойти это?

Спасибо.

+1

Что такое ожидаемое поведение увеличивающегося среза? Увеличиваете ли вы начало? Конец? И то и другое? – robert

+0

Ожидаемое поведение будет таким же, как и в коде matlab: приращение обоих - эффективное смещение среза на заданную величину. – lnmaurer

ответ

1

Нет, Python slice экземпляры immutable. Чтобы использовать стандартные экземпляры slice, вы должны создавать новый каждый раз. К сожалению, you can't subclass slice either.

3

Если вы определяете свой HXy_range как массив numpy, вы можете увеличить его по желанию. Если и когда вы хотите использовать его в качестве среза, вы можете сформировать slice(*HXy_range):

In [26]: HXy_range = np.array([1,10]) 

In [27]: HXy_range+1 
Out[27]: array([ 2, 11]) 

In [28]: slice(*(HXy_range+1)) 
Out[30]: slice(2, 11, None) 
+0

Это полезно знать. Тупой вопрос: что делает * в строке 28? – lnmaurer

+0

Используемый здесь '*' это [оператор распаковки Python] (http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists). – unutbu

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