寻找numpy.unique的更快替代方案——获取唯一RGB像素值
快速获取numpy数组中的唯一RGB像素值
针对你的需求,有两种高效方案可以避开np.unique的排序开销,直接得到唯一RGB颜色值:
方案一:利用numpy新版本的sort=False参数(推荐)
从numpy 1.23.0版本开始,np.unique新增了sort参数,设置为False后会跳过排序步骤,直接返回唯一值,速度会大幅提升,且无需额外转换:
import numpy as np # 假设im是形状为(400, 800, 3)的numpy数组 unique_rgb = np.unique(im.reshape(-1, 3), axis=0, sort=False)
返回的unique_rgb就是形状为(N, 3)的唯一RGB像素数组,完全符合需求。
方案二:RGB转整数去重后逆向转换(兼容旧版本)
如果你的numpy版本较低,不支持sort参数,可以先将RGB像素转换为唯一整数,用快速去重方法得到唯一整数后,再转回RGB格式:
- RGB转唯一整数:利用RGB通道的数值范围(通常是0-255的uint8类型),通过位运算将三个通道合并为单个整数,每个RGB组合对应唯一整数:
flat_im = im.reshape(-1, 3) # 位运算合并通道,等价于 r*256² + g*256 + b int_pixels = flat_im[:, 0] << 16 | flat_im[:, 1] << 8 | flat_im[:, 2] - 快速去重整数:用
np.unique处理整数数组(处理单通道整数比多通道RGB快很多,且可选择不排序):unique_ints = np.unique(int_pixels, sort=False) - 整数转回RGB:通过位运算拆分整数,还原三个通道的数值:
unique_rgb = np.column_stack([ (unique_ints >> 16) & 0xFF, # 提取红色通道 (unique_ints >> 8) & 0xFF, # 提取绿色通道 unique_ints & 0xFF # 提取蓝色通道 ])
这样得到的unique_rgb同样是唯一的RGB像素数组,且避免了对多通道数组的排序操作,速度显著优于默认的np.unique。
内容的提问来源于stack exchange,提问作者Octa
相关产品推荐
相关产品推荐

