2012-04-16 2 views
2

나는 matlab/octave에 쓴 몇 가지 코드를 포팅하여 numpy를 시도하고있다. matlab에, 나는 파이썬 슬라이스의 등가물을 정의 할 수 있고 필요에 따라 그것을 늘릴 수있다. 예를 들어, 내 MATLAB 코드에 나는에파이썬에서 슬라이스를 증가시킬 수 있습니까?

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)); 

용어가 '**의 핵심 부품 그들은이다 ('HXy_range + 1 '과 같은); HXy_range + 1은 2 : (NHXy + 1)과 같습니다. 파이썬에서는 비슷한 방법으로 슬라이스를 정의 할 수 있습니다.

HXx_range = slice(0, NHXx) 

그러나 HXx_range +1을 사용하면 오류가 발생합니다. 물론, 나는 그것을 위해 새로운 슬라이스를 만들 수는 있지만 깨끗하지는 않습니다. 이 문제를 해결할 방법이 있습니까?

감사합니다.

+1

증분 슬라이스의 예상되는 동작은 무엇입니까? 시작을 더 높이시겠습니까? 끝? 양자 모두? – robert

+0

예상되는 동작은 MATLAB 코드에서와 동일합니다 : 둘 다 증가 - 슬라이스를 주어진 양만큼 효과적으로 이동시킵니다. – lnmaurer

답변

1

아니요, 파이썬 slice 인스턴스는 immutable입니다. 표준 slice 인스턴스를 사용하려면 매번 새 인스턴스를 만들어야합니다. 죄송합니다. you can't subclass slice either.

3

숫자 배열로 HXy_range을 정의하면 원하는만큼 증가시킬 수 있습니다. 슬라이스로 사용하려는 경우 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 unpacking operator] (http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists)입니다. – unutbu

관련 문제