你知道如何改变循环以获得更高的效率吗?

2024-09-24 00:21:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我希望以一种更简单、更高效的方式使用条件进行循环。有人能想出一个办法吗?提前感谢您的帮助!!:)

OptVariableControle =np.array([])    
    j = 1
    for i in range (0,27):
        if  i == 2 :
            j = j+1
        if  i == 5:
            j = j+1
        if  i == 8:
            j = j+1
        if  i == 11:
            j = j+1
        if  i == 14:
            j = j+1
        if  i == 17:
            j = j+1
        if  i == 20:
            j = j+1
        if  i == 23:
            j = j+1
        OptVariableControle =np.append(OptVariableControle, 
                        (optionsActualise[i] + betas["beta" + str(j)]* (optionsActualise[i]-esperences[i])))

你好,我几乎不可能把我所有的代码都放在这里。但我可以确认betas是一个包含10(1到10)个元素的字典,OptionsRealize和Esperans是np.array of shape(27,)

最终使其工作:

betas_arr1 = np.array([betas[f'beta{j}'] for j in range(0, 9)])
OptVariableControle =np.array([])    


OptVariableControle = optionsActualise + betas_arr1[np.arange(0, 27) // 3] * (optionsActualise - esperences)

我希望这足够了


Tags: inforifnp方式range条件array
2条回答

您可以使用模数(%)运算符。当您用一个数字检查i时,如果是真的,您希望将j增加1。这里有一个模式,您正在检查的数字在除以3时给出2的余数,下面是如何实现此模式逻辑以使检查更简单、高效和紧凑:

OptVariableControle =np.array([])    
    j = 1
    # Replaced 27 by 26 here, as you do not want j to change when i is 26
    for i in range (0,26):
        if  i %3 == 2 :
            j = j+1

        OptVariableControle =np.append(OptVariableControle, 
                        (optionsActualise[i] + betas["beta" + str(j)]* (optionsActualise[i]-esperences[i])))

第一个预处理betas是一个大小合理的numpy数组。我假设它是一个字典或类似的映射:

betas_arr = np.array([betas[f'beta{j}'] for j in range(1, 10)])

接下来,请注意,每当i + 1 % 3 == 0时,您都会增加j。数组betas也将索引j更改为以0开头。这意味着对于任何给定的ij就是(i + 1) // 3

假设optionsActualiseesperances是numpy数组,您可以在不使用循环的情况下计算OptVariableControle

OptVariableControle = optionsActualise + betas[np.arange(1, 28) // 3] * (optionsActualise - esperences)

相关问题 更多 >