Присвойте значения различным позициям индекса как фактические в al oop python - PullRequest
0 голосов
/ 18 января 2020

У меня есть следующие переменные: List, float и массив numpy.

dt=list(range(1,12))   
c=18
limit=2.75
Energy=np.zeros(len(dt))  

Я хочу присвоить значение c=18 в массиве Numpy Energy. Однако есть условие. Значение в векторе Energy не может быть больше limit=2.75, так как c=18 больше limit=2.75, оно должно быть обрезано до 2.5 и назначено в фактической позиции индекса l oop и в следующих индексных позициях вектора Energy до достижения значения 18. Я сделал этот код, но он не очень эффективно работает.

for i in range(0,1): 
    if c>limit:
        tmp2=c-(limit)
        if tmp2>(limit):
            tmp3=tmp2-(limit)
            if tmp3>limit:
                tmp4=tmp3-(limit)
                if tmp4>(limit):
                    tmp5=tmp4-(limit)
                    if tmp5>(limit):
                        tmp6=tmp5-(limit)
                        if tmp6>limit:
                            tmp7=tmp6-(limit)
                            if tmp7>(limit):
                                tmp8=tmp7-(limit)
                            else:
                                Energy[i]=limit
                                Energy[i+1]=limit
                                Energy[i+2]=limit
                                Energy[i+3]=limit
                                Energy[i+4]=limit
                                Energy[i+5]=limit
                                Energy[i+6]=tmp7

У вас есть идея, как сделать его лучше? Спасибо!

1 Ответ

0 голосов
/ 18 января 2020

Добро пожаловать в stackoverflow!

В настоящее время ваш код использует al oop там, где он не нужен, и не использует al oop там, где его можно использовать.

Stepping в ваш код:

for i in range(0,1): 

Если мы изменим это на:

for i in range(0,1): 
    print (i)

Мы получим результат 0 - он запускается только один раз, поэтому нет необходимости l oop его - я не упоминаюсь в вашем коде, поэтому нет необходимости проходить через него l oop.

Вы можете использовать al oop для выделения вашего c массиву, но это не так. нужно, и я оставлю это как упражнение для себя.

К нему можно подойти другим, более эффективным способом.

Прежде всего, когда вы присваиваете переменные, попробуйте и сделайте их описательный и читабельный - вы потратите гораздо больше времени на возвращение к коду, чем на его чтение.

Я не знаю, какую систему вы описываете, поэтому я только дал обобщенные c имена :

import numpy as np

length_arrary=12

limit=2.75

value_to_be_assigned=18

energy_result=np.zeros(length_arrary)

Теперь мы действительно спрашиваем о двух вещах, сколько раз value_to_be_assigned разделить на предел (целое число) и то, что является остатком.

Python имеет две операции для этого деления этажа (//) и модуля, которые дают:

11//5 = 2.0
1%5   = 1.0

Так мы знаем, что первый (value_to_be_assigned // limit elements - 1) массива должен быть равен пределу, а конечный элемент должен быть равен value_to_be_assigned% limit

Наконец, Python имеет простой способ получить доступ к элементам списка - мы можем установить первые элементы x равными значению с помощью:

array[:x]=value

x просто должен быть целым числом.

Собрав его вместе, мы получим:

filled_values=int(value_to_be_assigned//limit)

energy_result[:filled_values]=limit

energy_result[filled_values] = value_to_be_assigned % limit

и мы можем проверить с

energy_result.sum() # gives us 18
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...