2017-08-27 59 views
2

我的循環等式很長。我想在將它代入方程行之前明確定義一個範圍。是否有可能將範圍作爲變量「var = k:k + number」

這是我的循環。 k代表範圍我想方程式

k = 0 
    char_num = np.array([196, 191, 122]) 

    for p in xrange(3): 
     # k = "k:(char_num[p]+ k)" # here is the range I which to use 

     ## below is the equation which is quite cluttering. 
     H[k,:] = (H[k,:]/(2)) * \ 
        ((np.sqrt((sum(W[:,k]))**2 + \ 
        (4*sum((V[:,:].T*W[:,k]).T/np.dot(W[:,:],H[:,:])))))) 


     # k += char_num[p] 

的使用是否有可能如僞代碼來定義k作爲一個範圍?

+1

它看起來像你的意思是定義一個*切片*,在這種情況下:https://docs.python.org/3/ library/functions.html#slice – jonrsharpe

+0

'k_arr = char_num + np.arange(len(char_num))'然後在'k_arr'上迭代:'爲k_arr'中的k? – Divakar

+0

@Divakar在這種情況下'k'是一個單一的數字。我想在第一個循環中使用'H [0:196,:]',爲第二個循環使用'H [196:387,:]'所以'k'必須是一個範圍? – Jan

回答

1

我們可以生成那些開始,在char_num停止指標與cumsum,然後使用這些循環中的切片H,像這樣 -

s = np.r_[0,char_num.cumsum()] 
for i,j in zip(s[:-1], s[1:]): 
    H[i:j,:] = ... 

採樣運行 -

In [18]: char_num = np.array([196, 191, 122]) 

In [19]: s = np.r_[0,char_num.cumsum()] 
    ...: for i,j in zip(s[:-1], s[1:]): 
    ...:  print(i,j) # print start, stop indices 
    ...:  
(0, 196) 
(196, 387) 
(387, 509) 

如果你真的除了切片之外,還需要將數組作爲數組進行某些處理,我們可以在循環中使用range(i,j)np.arange(i,j)。我們也可以使用該範圍進行切片,但是這會強制複製並會減慢速度。

或者,我們可以用切片的符號出現,就像這樣 -

slice0 = slice(i,j) 
H[slice0] = ... # equivalent to H[i:j], i.e. H[i:j,:] 
+0

我花了一段時間來包裝你的想法。這個很酷。非常感謝。我把'k = zip(s [:1],s [1:])'替換成'H'作爲'x [3]'中的'H [k [p] ,:]'。讓我再問你一個問題。如果我的char_num超長,你認爲這會很慢嗎?或者這裏最快的方法是什麼? – Jan

+1

@Jan如果你想讓它更快,使用s = np.concatenate(([[0],char_num.cumsum()))'。這是我在迭代部分中知道的最快方式。在總和減少量,即H [k ,:] ='的RHS上,似乎我們可以進一步優化。 – Divakar

相關問題