#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
.