Проблема с обновлением элементов массива в цикле for - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу переопределить элементы массива в моей функции roll

roll_current = 0

def roll(t):
    global roll_current

    # Generate array of the same numbers
    roll_current_ =  np.full((len(t)), roll_current)

    delta_roll_ = 0.1 - np.exp(-t)
    diff_ = roll_current_ - delta_roll_     

    # Update roll_current_ array
    for i, x in enumerate(roll_current_):
        if diff_[i]>0:
            roll_current_[i] = x - abs(diff_[i]) # x is equal to roll_current_[i] 
        elif diff_[i]<0:
            roll_current_[i] = x + abs(diff_[i]) 

    # Save value for the last time step
    roll_current = roll_current_[-1] # Scalar

    return roll_current_

Но если я использую присваивание -= или += или код выше, массив roll_current_ не изменяется иследующие строки

t = np.linspace(0,4,10)
roll(t)

дают array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])

Что не так?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Я нашел проблему в вашем коде:

Метод fill заполняет массив значением roll_current, которое является целым числом.Таким образом, массив также будет иметь тип int.Затем в цикле for все значения, которые вы пытаетесь установить, находятся в диапазоне от -1 до 1 и поэтому округляются до нуля.Чтобы решить проблему, измените эту строку

roll_current_ =  np.full((len(t)), roll_current)

на эту

roll_current_ =  np.full((len(t)), roll_current, dtype = np.float)

В качестве альтернативы вы можете просто инициализировать roll_current следующим образом:

roll_current = 0.
0 голосов
/ 21 февраля 2019

Если вы печатаете roll_current_ = np.full((len(t)), roll_current) вывод:

[0 0 0 0 0 0 0 0 0 0]

, вероятно, вы этого не хотите.

Пожалуйста, не используйте глобальные переменные, если вы можете избежать этого, почему бы не def roll(t, roll_current)?

В цикле for не обновляйте тот же массив, который вы повторяете, вместо этого создайте другой массив, добавляя новые элементы.

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