Подход # 1
Вы можете сэкономить много на данных промежуточного массива с расширением уникального colors
до более высокого затемнения, а затем сравнивать с исходным массивом данных и затем использовать маску напрямуючтобы получить окончательный результат -
# Get unique colors (remove black)
colors = np.unique(image.reshape(-1,3), axis=0)
colors = np.delete(colors, [0,0,0], axis=0)
mask = (colors[:,None,None,:]==image).all(-1)
out = mask[...,None]*np.array([255,255,255])
Подход # 2
Лучший / эффективный для памяти способ получить, что mask
будет с чем-то вроде этого -
u,ids = np.unique(image.reshape(-1,3), axis=0, return_inverse=1)
m,n = image.shape[:-1]
ids = ids.reshape(m,n)-1
mask = np.zeros((ids.max()+1,m,n),dtype=bool)
mask[ids,np.arange(m)[:,None],np.arange(n)] = ids>=0
и, следовательно, лучший способ получить окончательный результат, например, -
out = np.zeros(mask.shape + (3,), dtype=np.uint8)
out[mask] = [255,255,255]
и, вероятно, лучший способ получить ids
будет с matrix-multiplication
.Следовательно:
u,ids = np.unique(image.reshape(-1,3), axis=0, return_inverse=1)
можно заменить на:
image2D = np.tensordot(image,256**np.arange(3),axes=(-1,-1))
ids = np.unique(image2D,return_inverse=1)[1]