Python 是否可以将范围设置为变量;var=k:k+;“数字”;

Python 是否可以将范围设置为变量;var=k:k+;“数字”;,python,python-2.7,numpy,Python,Python 2.7,Numpy,我的循环方程很长。在将其代入方程行之前,我想定义一个范围 这是我的循环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 clutt

我的循环方程很长。在将其代入方程行之前,我想定义一个范围

这是我的循环
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定义为伪代码显示的范围?

我们可以使用
char\u num
上的
cumsum
生成开始、停止索引,然后使用循环中的索引进行切片
H
,如下所示-

s = np.r_[0,char_num.cumsum()]
for i,j in zip(s[:-1], s[1:]): 
    H[i:j,:] = ...
slice0 = slice(i,j)
H[slice0] = ... # equivalent to H[i:j], i.e. 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)
。我们也可以使用该范围进行切片,但这将强制复制,并会减慢速度

或者,我们可以在那里使用切片表示法,如下所示-

s = np.r_[0,char_num.cumsum()]
for i,j in zip(s[:-1], s[1:]): 
    H[i:j,:] = ...
slice0 = slice(i,j)
H[slice0] = ... # equivalent to H[i:j], i.e. H[i:j,:]

看起来你的意思是定义一个切片,在这种情况下:
k\u arr=char\u num+np.arange(len(char\u num))
然后迭代
k\u arr
对于k\u arr
?@Divakar在这种情况下
k
是一个数字。我希望第一个循环使用
H[0:196,:]
,第二个循环使用
H[196:387,:]
。。。所以
k
必须是一个范围吗?@jornsharpe谢谢。我不知道我已经用了什么叫做切片。那么我们可以把切片作为变量吗?我花了一段时间来阐述你的想法。很酷。非常感谢。我将
k=zip(s[:-1],s[1:])
替换为
H
作为
H[k[p],:]
中的
用于xrange(3)
中的p。我再问你一个问题。如果我的
char\u num
超长,您认为这会很慢吗?或者这里最快的方法是什么?@Jan如果您想让它更快,请使用
s=np.concatenate([0],char_num.cumsum())
。这是我所知道的迭代部分最快的方法。关于总和缩减,即
H[k,:]=
的RHS,我们似乎可以进一步优化。