脾气暴躁的地方

时间:2018-07-12 03:58:50

标签: python numpy

问题很简单。给定256x256灰度图像,我想返回一个基于阈值的彩色图像。

所以我在想:

img=whatever # 2D array of floats representing grayscale image
threshold=0.5
color1=[1.0,0.0,0.0]
color2=[0.0,0.0,1.0]
newImg=np.where(img>threshold,color1,color2)

但我臭名昭著: “ ValueError:操作数不能与形状(500,500)(3,)(3,)一起广播”

嗯?我真的期望得到一个数组形状(500,500,3)。为什么不将它们结合在一起?

2 个答案:

答案 0 :(得分:3)

您误解了numpy.where的工作方式。似乎您可能在想,对于img>threshold的True单元格,where选择整个color1作为值,对于False单元格,它选择整个{{1} }。无论您在想什么,它都不是这样。

color2 broadcasts参数一起,然后为第一个参数的每个单元格选择第二个或第三个参数的对应单元格。为了产生形状为(500,500,3)的结果,参数必须一起广播为形状为(500,500,3)。您的输入完全不兼容广播。

使广播工作可行的一种方法是在numpy.where的末尾添加一个额外的length-1尺寸:

img>threshold

如果您不熟悉广播,可以使用numpy.broadcast_arrays查看一起广播多个数组的结果。

答案 1 :(得分:0)

编辑:我意识到我最初错误解释了原始数组尺寸,如user2357112所指出。

要为不需要numpy的原始问题添加其他解决方案,请使用:

private static <T extends BaseObject> T getItemType(String value, Class<T> requiredType, MessageConverter messageConverter) throws Exception
相关问题