我在循环中的等式很长。在将其替换为方程线之前,我想明确定义一个范围。
这是我的循环。 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定义为显示伪代码的范围?
答案 0 :(得分:1)
我们可以在cumsum
上使用char_num
生成那些开始,停止索引,然后使用循环内的那些来切片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,:]