Заменить значения из определенных столбцов в массиве значениями в соседних столбцах - PullRequest
0 голосов
/ 22 декабря 2019

Я пытаюсь снизить быстродействие следующей проблемы. У меня есть массив, например:

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))

Это дает:

first_array_example

У меня всегда будет один столбец с различными числами с плавающей запятой(давайте назовем эти столбцы «random_numbers»), за которым следует еще один столбец, содержащий только значения -1,0, 0,0 и 1,0 (давайте назовем эти столбцы «ones_zeros»).

Конечная цель - заменитьлюбые значения -1.0 или 1.0 (примечание: не 0.0) со значением непосредственно слева. Для этого примера выходные данные будут такими:

example_output

В настоящее время я преобразовываю массив 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, а не панд? Или, может быть, более быстрый способ использования панд? Я не могу добиться прогресса в этом, так как я постоянно индексирую не тот раздел или не могу заменить правильные строки / столбцы. Спасибо!

Ответы [ 2 ]

1 голос
/ 22 декабря 2019

Вы можете использовать np.where для замены значений:

import numpy as np
import pandas as pd

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]

df = pd.DataFrame({0:list1, 1:list2, 2:list3, 3:list4})

df.iloc[:, 1::2] = np.where(df.iloc[:, 1::2].isin([1, -1]), df.iloc[:, ::2], 0)
print(df.to_numpy())

Печать:

[[ 0.564  0.     0.76   0.76 ]
 [ 0.011  0.011  0.013  0.013]
 [ 0.56   0.56  -0.58   0.   ]
 [-1.1    0.     1.12   1.12 ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -0.983  0.833  0.833]]

РЕДАКТИРОВАТЬ: версия, где имена столбцовявно выбраны:

import numpy as np
import pandas as pd

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]

df = pd.DataFrame({'Pressure':list1, 'Pressure 0-1':list2, 'Temperature':list3, 'Temperature 0-1':list4})

df[['Pressure 0-1', 'Temperature 0-1']] = np.where(df[['Pressure 0-1', 'Temperature 0-1']].isin([1, -1]), df[ ['Pressure', 'Temperature'] ], 0)
print(df)

Отпечатки:

   Pressure  Pressure 0-1  Temperature  Temperature 0-1
0     0.564         0.000        0.760            0.760
1     0.011         0.011        0.013            0.013
2     0.560         0.560       -0.580            0.000
3    -1.100         0.000        1.120            1.120
4     0.344         0.000        0.144            0.000
5     0.912         0.000       -0.929            0.000
6    -0.983        -0.983        0.833            0.833
0 голосов
/ 22 декабря 2019

Здесь:

for x, y in np.argwhere(np.abs(test_arr) == 1.):
    test_arr[x, y] = test_arr[x, y-1]

До:

[[ 0.564  0.     0.76  -1.   ]
 [ 0.011  1.     0.013  1.   ]
 [ 0.56   1.    -0.58   0.   ]
 [-1.1    0.     1.12   1.   ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -1.     0.833  1.   ]]

После:

[[ 0.564  0.     0.76   0.76 ]
 [ 0.011  0.011  0.013  0.013]
 [ 0.56   0.56  -0.58   0.   ]
 [-1.1    0.     1.12   1.12 ]
 [ 0.344  0.     0.144  0.   ]
 [ 0.912  0.    -0.929  0.   ]
 [-0.983 -0.983  0.833  0.833]]

Логика: для всех x и y координатзначения 1 или -1, заменить на левое значение.

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