Я пытаюсь снизить быстродействие следующей проблемы. У меня есть массив, например:
list1 = [0.564,0.011,0.560,-1.100,0.344,0.912,-0.983]
list2 = [0.0,1.0,1.0,0.0,0.0,0.0,-1.0]
list3 = [0.760,0.013,-0.580,1.120,0.144,-0.929,0.833]
list4 = [-1.0,1.0,0.0,1.0,0.0,0.0,1.0]
test_arr = np.column_stack((list1, list2,list3,list4))
Это дает:
У меня всегда будет один столбец с различными числами с плавающей запятой(давайте назовем эти столбцы «random_numbers»), за которым следует еще один столбец, содержащий только значения -1,0, 0,0 и 1,0 (давайте назовем эти столбцы «ones_zeros»).
Конечная цель - заменитьлюбые значения -1.0 или 1.0 (примечание: не 0.0) со значением непосредственно слева. Для этого примера выходные данные будут такими:
В настоящее время я преобразовываю массив numpy в pandas и применяю следующую функцию:
def replace_values(test_arr_df,random_numbers,ones_zeros):
for cc in range(len(random_numbers)):
test_arr_df[ones_zeros[cc]] = test_arr_df.apply(
lambda row: row[random_numbers[cc]] if row[ones_zeros[cc]]==1 or row[ones_zeros[cc]]==-1
else row[ones_zeros[cc]],axis=1
)
return test_arr_df
Применение его к нашему тестовому примеру:
#Convert to dataframe
test_arr_df=pd.DataFrame(test_arr)
#Tell the function what is a variable column and what is a minmax column
variable_columns = [0,2]; minmax_columns = [1,3]
#Replace values
res_df = replace_values(test_arr_df,variable_columns,minmax_columns)
Этот метод панд работает, давая тот же результат, что и в примере, приведенном выше. Тем не менее, это очень медленно. В других частях моего кода я успешно сократил время обработки, сохранив пустые массивы и не переключаясь на панд, но здесь я потерпел неудачу.
Итак, мой вопрос, есть ли способ сделать это, используя numpy, а не панд? Или, может быть, более быстрый способ использования панд? Я не могу добиться прогресса в этом, так как я постоянно индексирую не тот раздел или не могу заменить правильные строки / столбцы. Спасибо!