给定形状(height, width)的Numpy矩阵,我正在寻找最快的方法来创建形状(height, width, 4)的另一个Numpy矩阵,其中4表示RGBA值。我想做这个基于值的工作;因此,对于第一个矩阵中所有的0值,我希望在第二个矩阵中的同一位置有一个[255, 255, 255, 0]值。
我想用NumPy来做这件事,而不需要像下面这样缓慢地迭代:
for i in range(0, height):
for j in range(0, width):
if image[i][j] = 0:
new_image[i][j] = [255, 255, 255, 0]
elif image[i][j] = 1:
new_image[i][j] = [0, 255, 0, 0.5]如您所见,我正在创建一个矩阵,其中值0变为透明白色,1变为绿色,α为0.5;是否有更快的NumPy解决方案?
我猜想numpy.where会极大地帮助加速这个过程,但是我还没有找到多个和多个值转换的适当实现。
发布于 2020-05-07 15:00:05
对于一个更干净的解决方案,特别是在处理多个标签时,我们可以使用np.searchsorted来追溯映射的值,如下所示-
# Edit to include more labels and values here
label_ar = np.array([0,1]) # sorted label array
val_ar = np.array([[255, 255, 255, 0],[0, 255, 0, 0.5]])
# Get output array
out = val_ar[np.searchsorted(label_ar, image)]请注意,这假定来自image的所有唯一标签都在label_ar中。
那么,假设我们在2和3的image中又有两个标签,类似这样的东西-
for i in range(0, height):
for j in range(0, width):
if image[i,j] == 0:
new_image[i,j] = [255, 255, 255, 0]
elif image[i,j] == 1:
new_image[i,j] = [0, 255, 0, 0.5]
elif image[i,j] == 2:
new_image[i,j] = [0, 255, 255, 0.5]
elif image[i,j] == 3:
new_image[i,j] = [255, 255, 255, 0.5]我们将相应地编辑标签和值,并使用相同的searchsorted解决方案-
label_ar = np.array([0,1,2,3]) # sorted label array
val_ar = np.array([
[255, 255, 255, 0],
[0, 255, 0, 0.5],
[0, 255, 255, 0.5],
[255, 255, 255, 0.5]])发布于 2020-05-07 15:05:01
你是对的,np.where是你解决这个问题的方法。哪里是一个矢量化函数,所以它应该比您的解决方案快得多。
我在这里假设,这里没有我所知道的elif,但是您可以通过嵌套where语句来解决这个问题。
new_image = np.where(
image == 0,
[255, 255, 255, 0],
np.where(
image == 1,
[0, 255, 0, 0.5],
np.nan
)
)https://stackoverflow.com/questions/61660767
复制相似问题