Как использовать многопроцессорный модуль для обновления каждого элемента многомерного массива numpy - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу применить многопроцессорный модуль для ускорения обновления элементов массива.

Вот код WIP ...

counter = Value(c_int)  # defaults to 0
# counter_lock = Lock()
def increment():
    with counter.get_lock():
        counter.value += 1
    print(f'\r{counter.value}/{total} has been completed.', end='')

total = len(data_paths)

# Assign number to the data
data_w_num=list(enumerate(data_paths))

def prepare_data(data_w_num):
    i, imgs = data_w_num

    try:
        with data.get_lock():
            data[i] = np.array([preprocess(read_img(imgs[m]), input_shape[1:]) for m in ['t1', 't2', 't1ce', 'flair']], dtype=np.float32)
        with data.get_lock():
            labels[i] = preprocess_label(read_img(imgs['seg']), input_shape[1:])[None, ...] 

        # Print the progress bar
        increment()

    except Exception as e:
        print(f'Something went wrong with {imgs["t1"]}, skipping...\n Exception:\n{str(e)}')
        return


with Pool(cpu_count()) as p:
    print('total: ' + f'{total}')
    r = p.map_async(prepare_data, data_w_num)
    print("Processing...")
    r.wait()
    print('\nAll processes were done.')

Переменная data_paths выглядит следующим образом:

enter image description here


Но это не работает. Сообщение об ошибке было «только массивы размера 1 могут быть преобразованы в скаляры Python». И я не уверен, как применить многопроцессорность.

Я был бы рад, если бы вы помогли мне решить эту проблему.


...