Как построить матрицу numpy (с нуля, ранее не существовавшую), добавляя вычисляемые столбцы в цикл for - PullRequest
1 голос
/ 11 апреля 2020

Это школьная задача (параллельная нормализация каждого столбца матрицы), и, помимо других проблем, которые вы можете видеть, мне было особенно трудно найти что-то простое, например list = [], который вы можете использовать list.append () целые списки в al oop до, без предопределенных размеров. Вот что я имею до сих пор с рассматриваемой строкой в ​​конце. Заранее благодарю за любую помощь!

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__":
    pool = Pool()
    arr = np.random.uniform(0, 100, size=(6, 3))
maybe predefine arr_norm here?
    for i in range(2):
        print("i = ", i)
        col = arr[:, i]
        result = pool.map(fct_norm, [col])
        norm_arr = HOW_TO_ADD_EACH_RESULT_COLUMN_TO_A_NEW_ARRAY?

1 Ответ

1 голос
/ 12 апреля 2020

Функция объединения нескольких столбцов: 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.

Таким образом, вся операция может быть выполнена в две строки.

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