Ошибка индекса в функции цикла при передаче аргументов с помощью np.vectorize

#python #pandas #numpy #indexing #vectorization

Вопрос:

Я передаю массивы numpy функции с использованием np.vectorize, но функция не распознает индексы массивов… или происходит что-то еще, но я получаю ошибку IndexError: недопустимый индекс скалярной переменной в этой строке кода:

 if (value[r-1] == 0) amp; (value[r] != 0):
 

Функция перебирает 300 тысяч значений, поэтому я использую векторизацию для максимальной скорости. Петля неизбежна. Аргументы, передаваемые функции, поступают из фрейма данных. Функция возвращает три списка, два из которых используются для замены исходных столбцов в фрейме данных Panda.

 def CumRain(value, event, crain, length):
    for r in range(1, length):
        numeven = 1
        if (value[r-1] == 0) amp; (value[r] != 0):
            event[r] = numeven
            crain[r] = value[r]
        elif (value[r-1] != 0) amp; (value[r] != 0):
            event[r] = numeven
            crain[r] = value[r]   crain[r-1]
        elif (value[r-1] != 0) amp; (value[r] == 0):
            event[r] = 0
            numeven = numeven   1
        else:
            numeven = numeven
    return [event, crain, numeven]

df_rain['Event_Group_allYears', 'CUM_Rain'] = np.vectorize(CumRain)       
      (df_rain['RD_VALUE'].to_numpy(), df_rain['Event_Group_allYears'].to_numpy(), 
      df_rain['CUM_Rain'].to_numpy(), len(df_rain['RD_VALUE']))
 

Любая помощь в этом очень ценится. Я очень новичок в Python, поэтому ошибки могли быть сделаны где угодно… 🙂

Комментарии:

1. Логический оператор «и» в Python-это слово and , а не amp; оператор.

2. Ваша функция будет вызываться с каждым элементом, по одному за раз. Если вам нужно смотреть вперед или оглядываться назад, то вы не можете использовать vectorize . Вам придется пройти столбцы напрямую.

3. Я собирался опубликовать ответ, перейдя df_rain['RD_VALUE'].to_numpy()[1:] во вторую колонку, но тот факт, что вам нужно сохранять состояние ( numeven ) от звонка до звонка, затрудняет это.

4. np.vectorize передает скалярные значения в вашу функцию. Как говорится в ошибке scalar variable . Вы не можете индексировать value , event или crain . И, несмотря на название np.vectorize , это не инструмент повышения производительности (прочитайте его документы!). Это медленнее, чем обычная итерация. np.vectorize не «проникает» в вашу функцию и не компилирует ее.

5. Я подозреваю, что вы CUM_Rain могли бы быть написаны без цикла. Например, первым тестом может быть mask = (value[:-1]==0)amp;(value[1:]!=0) и event[1:][mask] = numeven .