2017-10-12 95 views
1

我正在嘗試重新編寫一些看起來像是由FORTRAN程序員編寫的代碼,以使其更具Pythonic /可讀性。以下是感興趣的代碼片段。該代碼的整體行爲是將Z的前三個元素存儲到Zstart中,只要值小於1,並且還將Z的最後三個值存儲到Zend中,只要它們小於1。以相反的順序訪問numpy數組的pythonic方式

import numpy as np 
nbpoints = 3 
Z = np.linspace(0,1.0,10) 
Zstart = np.ones(nbpoints) 
Zend = np.ones(nbpoints) 
Zpts = np.size(Z) 
for j in range(nbpoints): 
    if Z[j] < Zstart[j]: 
     Zstart[j] = Z[j] 
    if Z[Zpts - 1 - j] < Zend[nbpoints - 1 - j]: 
     Zend[nbpoints - 1 - j] = Z[Zpts - 1 - j] 

ZStart和Zend從兩端移動訪問的計數器正在讓我有點絆倒。我目前的解決方案如下。從這個代碼

import numpy as np 
nbpoints = 3 
Z = np.linspace(0,1.0,10) 
Zstart = np.ones(nbpoints) 
Zend = np.ones(nbpoints) 
Zpts = np.size(Z) 
for j in range(nbpoints): 
    if Z[j] < Zstart[j]: 
     Zstart[j] = Z[j] 
    if Z[-(j+1)] < Zend[-(j+1)]: 
     Zend[-(j+1)] = Z[-(j+1)] 

輸出樣品是:

Z = [ 0.0 0.11111111 0.22222222 0.33333333 0.44444444 0.55555556 
0.66666667 0.77777778 0.88888889 1.0 ] 

Zstart = [ 0.0 0.11111111 0.22222222] 
Zend = [ 0.77777778 0.88888889 1.0 ] 

我的解決方案感覺就像我仍然只是重寫寫得不好的代碼如重新安排泰坦尼克號甲板上的椅子。是否有更多的Pythonic方式來執行此操作?

+0

你能給輸入和期望輸出的例子嗎? –

+0

@JulienSpronck我添加了示例輸出。輸入只是Z數組。一個一維numpy數組,從0到1.在實際的代碼中,它被傳入,但爲了這段代碼的目的,我只是使用numpy linspace函數來模擬輸入數據。 – wandadars

+0

@wandadars如果起始值> 1,會發生什麼情況?你只存儲那些<1,或者根本不存儲? –

回答

1

相同的結果,你並不需要實例ZstartZendnp.ones。只需直接建立他們:

nbpoints = 3 
Z = np.linspace(0,1.0,10) 
Zstart = Z[:nbpoints][Z[:nbpoints] < 1] 
Zend = Z[-nbpoints:][Z[-nbpoints:] < 1] 

print(Zstart) 
print(Zend) 
# [ 0.   0.11111111 0.22222222]  
# [ 0.77777778 0.88888889] 

注意Zend只有2個元素在這裏,因爲在Z的最後一個元素是不小於1

1

該代碼給出不移動計數器

nbpoints = 3 
Z=np.linspace(0,1.,10.)    
Zstart = np.ones(nbpoints)    
Zend = np.ones(nbpoints)    

Zstart[Z[:nbpoints] < 1] = Z[:nbpoints][Z[:nbpoints] < 1] 
Zend[Z[-nbpoints:] < 1] = Z[-nbpoints:][Z[-nbpoints:] < 1]