Функция объединения нескольких столбцов: np.hstack
. Однако большая проблема заключается в том, что pool.map
неправильно используется в исходном коде.
Как написано, параллельное выполнение столбцов не выполняется, поскольку каждый вызов pool.map
получает только один колонка. Идея состоит в том, чтобы передать итератор с несколькими значениями одновременно - в этом случае несколько столбцов в pool.map
.
Поскольку numpy
циклически перебирает строки, а не столбцы, матрица должна быть транспонирована ( используя оператор (...).T
. Кроме того, после завершения pool
целесообразно закрыть его. Один из способов справиться с этим автоматически - это использовать контекст (т. е. конструкцию with Pool() as pool:
, так как это будет закрыть автоматически.
Все это вместе дает следующее решение:
from multiprocessing import Pool
import numpy as np
def fct_norm(col):
mn = col.min()
mx = col.max()
col_norm = np.zeros((6, 1))
for i in range(6):
col_norm[i, 0] = (col[i] - mn) / (mx - mn)
return col_norm
if __name__ == "__main__":
arr = np.random.uniform(0, 100, size=(6, 3))
with Pool() as pool:
norm_arr = np.hstack(pool.map(fct_norm, arr.T))
# Here norm_arr is available for further operations.
Таким образом, вся операция может быть выполнена в две строки.