Вы знаете, как изменить l oop на что-то более производительное? - PullRequest
0 голосов
/ 01 апреля 2020

Я собираюсь сделать это с условием, которое будет проще и продуктивнее. Кто-нибудь может придумать способ сделать это? Заранее спасибо за вашу помощь!! :)

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])))

Здравствуйте, для меня было бы почти невозможно разместить весь мой код здесь. Но я могу подтвердить, что бета-версии - это словарь из 10 (от 1 до 10) элементов, optionsActualise и esperances - это 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)

Надеюсь, этого достаточно

Ответы [ 2 ]

0 голосов
/ 01 апреля 2020

Первый препроцесс betas должен быть массивом numpy разумного размера. Я предполагаю, что это словарь или подобное сопоставление:

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

Далее, обратите внимание, что вы увеличиваете j всякий раз, когда i + 1 % 3 == 0. Массив ification betas также изменяет индекс j, начиная с 0. Это означает, что для любого заданного i, j равно (i + 1) // 3.

Предполагая, что optionsActualise и esperances - это numpy массивы, вы можете вычислить OptVariableControle без всех oop:

OptVariableControle = optionsActualise + betas[np.arange(1, 28) // 3] * (optionsActualise - esperences)
0 голосов
/ 01 апреля 2020

Вы можете использовать оператор модуль (%) . Поскольку вы проверяете i с помощью числа, и если оно истинно, вы хотите увеличить j на 1. Здесь есть шаблон, число, которое вы проверяете, дает остаток от 2 при делении на 3 , вот как вы можете реализовать этот шаблон logi c, чтобы сделать проверку проще, продуктивнее и компактнее:

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])))
...