Детали предварительных условий этого кода довольно длинные, поэтому я постараюсь изо всех сил подвести итог. WB/RG/BYColor - это базовое изображение, FIDO - это наложение этого базового изображения, которое применяется к нему. S_wb/rg/by - окончательные выходные изображения. WB/RG/BYColor имеют тот же размер, что и FIDO.
Для каждого уникального элемента в FIDO мы хотим рассчитать средний цвет этой области в базовых изображениях. Код ниже делает это, но, поскольку numFIDOs очень велико (до 40 000), это занимает долгое время.
Средние значения вычисляются для трех отдельных каналов RGB.
sX=200
sY=200
S_wb = np.zeros((sX, sY))
S_rg = np.zeros((sX, sY))
S_by = np.zeros((sX, sY))
uniqueFIDOs, unique_counts = np.unique(FIDO, return_counts=True)
numFIDOs = uniqueFIDOs.shape
for i in np.arange(0,numFIDOs[0]):
Lookup = FIDO==uniqueFIDOs[i]
# Get average of color signals for this FIDO
S_wb[Lookup] = np.sum(WBColor[Lookup])/unique_counts[i]
S_rg[Lookup] = np.sum(RGColor[Lookup])/unique_counts[i]
S_by[Lookup] = np.sum(BYColor[Lookup])/unique_counts[i]
Это займет около 7,89 секунд для запуска, не так долго, но это будет включено в другой цикл, поэтому он будет наращиваться!
Я пробовал векторизация (показано ниже), но я не мог этого сделать
FIDOsize = unique_counts[0:numFIDOs[0]:1]
Lookup = FIDO ==uniqueFIDOs[0:numFIDOs[0]:1]
S_wb[Lookup] = np.sum(WBColor[Lookup])/FIDOsize
S_rg[Lookup] = np.sum(RGColor[Lookup])/FIDOsize
S_by[Lookup] = np.sum(BYColor[Lookup])/FIDOsize
ошибка при сопоставлении размера массива