Многопроцессорный ввод 2d-массива на Python

#python #arrays #numpy #multiprocessing

#python #массивы #numpy #многопроцессорная обработка

Вопрос:

Я пытаюсь создать пул процессов, используя многопроцессорную обработку с аргументами 2d-массива, используя starmap. Однако аргументы, похоже, вводятся строка за строкой, а не элемент за элементом.

Я хотел бы использовать каждый элемент для создания 3D выходного массива с массивом, соответствующим каждому элементу в 2d входном массиве

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

 import multiprocessing
import numpy as np

MeshNumberY = 5
MeshNumberX = 10

result_list = np.zeros( (MeshNumberX,MeshNumberY,3) )

Xindices = np.tile(np.arange(MeshNumberX),(MeshNumberY,1))
Yindices = np.tile(np.reshape(np.arange(MeshNumberY),(MeshNumberY,1)),(1,MeshNumberX))

def image_pixel_array(x,y):
    return np.array([5*x,5*y,255])

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    result_list = np.array(pool.starmap(image_pixel_array, zip(Xindices, Yindices)))
    print(result_list)
  

Входные массивы Xindices и Yindices были,

 [[0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]
 [0 1 2 3 4 5 6 7 8 9]]
  

и

 [[0 0 0 0 0 0 0 0 0 0]
 [1 1 1 1 1 1 1 1 1 1]
 [2 2 2 2 2 2 2 2 2 2]
 [3 3 3 3 3 3 3 3 3 3]
 [4 4 4 4 4 4 4 4 4 4]]
  

соответственно, с соответствующим выводом, являющимся,

 [[array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
  array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45]) 255]
 [array([5, 5, 5, 5, 5, 5, 5, 5, 5, 5])
  array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45]) 255]
 [array([10, 10, 10, 10, 10, 10, 10, 10, 10, 10])
  array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45]) 255]
 [array([15, 15, 15, 15, 15, 15, 15, 15, 15, 15])
  array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45]) 255]
 [array([20, 20, 20, 20, 20, 20, 20, 20, 20, 20])
  array([ 0,  5, 10, 15, 20, 25, 30, 35, 40, 45]) 255]]
  

Моя цель — получить вывод, более похожий,

 [[[0 0 255] [5 0 255] [10 0 255] [15 0 255] [20 0 255] [25 0 255] [30 0 255] [35 0 255] [40 0 255] [45 0 255]]
[[[0 5 255] [5 5 255] [10 5 255] [15 5 255] [20 5 255] [25 5 255] [30 5 255] [35 5 255] [40 5 255] [45 5 255]]
etc.
  

Если есть предложение оптимизировать то, как я настраиваю свои массивы, это, безусловно, также приветствовалось бы, поскольку я довольно новичок в этом.

Все это было написано на Python 3.7.

Заранее благодарю вас за помощь!

Комментарии:

1. Итерация выполняется в первом измерении массива, в вашем 2d случае по строкам. Протестируйте это с for x in arr:...

Ответ №1:

Я пробовал это

 import multiprocessing
import numpy as np

MeshNumberY = 5
MeshNumberX = 10

result_list = np.zeros( (MeshNumberX,MeshNumberY,3) )

Xindices = np.tile(np.arange(MeshNumberX),(MeshNumberY,1))
Yindices = np.tile(np.reshape(np.arange(MeshNumberY),(MeshNumberY,1)),(1,MeshNumberX))
Zindices = Yindices.copy()

def image_pixel_array(x,y,z):

    return np.transpose([5*x,5*y,z*0 255])

if __name__ == '__main__':
    pool = multiprocessing.Pool(processes=multiprocessing.cpu_count())
    result_list = np.array(pool.starmap(image_pixel_array, zip(Xindices, Yindices,Zindices)))
    print(np.reshape(result_list,(MeshNumberY,MeshNumberX,3),order='F'))
  

Комментарии:

1. Спасибо за отзыв. Это работает нормально, но для моего фактического кода у меня разное количество входных массивов. Есть ли способ обобщить это для любого количества аргументов? Я также не уверен, почему в качестве аргументов здесь берутся отдельные элементы, а не строки, как в моем коде.

2. печать (np.reshape(result_list,(MeshNumberY,MeshNumberX,3),order =’F’)) изменение на печать (result_list) по-прежнему работает нормально,