Numpy: 如何在给定测试条件下使用多维数组中的np.where?

2024-10-01 17:21:48 发布

您现在位置:Python中文网/ 问答频道 /正文

编辑:由于我的第一个问题可能太混乱了,所以我把问题简化为一个最小的问题

当我使用np.哪里在标量单元的条件下,一切正常:

new_array = np.where(old_array==6, rempl_array, old_array)

但如果我想让我的条件对数组的全维起作用:

new_array = np.where((old_array == [1, 2, 3]).all(axis=-1), rempl_array, old_array)

我再也没有了,因为尺寸不匹配

但是我不知道如何转换2D布尔值(旧的数组==[1,2,3])。所有(轴=-1)在一个合适的3D布尔值中


这是最初的帖子:

我有一个3D数组,是我从一张图片中创建的(所以尺寸代表高度、宽度和RGB值)。我想根据给定的条件改变颜色。你知道吗

    submap = np.any([(carr == [pr["red"], pr["green"], pr["blue"]]).all(axis=-1) for pr in list_areas], axis=0)

该条件工作正常,对于满足该条件的像素,使用True重新运行2D数组,否则使用False重新运行。你知道吗

但是,当我尝试构建一个新的3D阵列时,我会根据该条件更改颜色:

    new_carr = np.where(submap, new_color, carr)

出现形状不匹配错误:

ValueError: operands could not be broadcast together with shapes (2048,5632) (3,) (2048,5632,3)

问题似乎不仅仅是我的新颜色有形状(3,3),因为当我用形状数组(20485632,3)替换它时问题仍然存在,而是我的条件是二维的,而我的初始数组是三维的。但是这个条件怎么可能不是二维的定义,我怎么能使这个工作呢?你知道吗

谢谢你的帮助


Tags: new颜色尺寸np数组prallwhere
2条回答

从这张帕丁顿的照片开始:

enter image description here

我想您应该使用np.where()如下将所有红色区域变成品红,将所有其他区域变成黄色:

#!/usr/bin/env python3

from PIL import Image
import numpy as np

# Load PIL Image and ensure RGB rather than palette based, then make into Numpy array
pi = Image.open('paddington.png').convert('RGB')
na = np.array(pi)

# Now make 2 images same size, one magenta, one yellow
magenta = np.zeros_like(na) + [255,0,255]
yellow  = np.zeros_like(na) + [255,255,0]

# Anywhere paddington is red, make him magenta. Anywhere else, make him yellow.
result = np.where((na==[255,0,0]).all(axis=-1)[...,None], magenta, yellow) 

# Save result
Image.fromarray(result.astype(np.uint8)).save('result.png')

enter image description here

当然,这是没有必要的,使一个完整的洋红和黄色的图像大小,我只是这样做,以符合您的原始代码。你可以用一个像素,节省内存,让他变成绿色和蓝色,就像这样:

result = np.where((na==[255,0,0]).all(axis=-1)[...,None], [0,255,0], [0,0,255]) 

enter image description here

事实上,我已经用一种非常丑陋的方式解决了我的问题

submap = np.array([[[b, b, b] for b in x] for x in submap.tolist()])

但这孩子似乎效率低下。应该有一种方法只使用数组来实现这一点。你知道吗

相关问题 更多 >

    热门问题