微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用numpy.where查找条件复杂的索引?

如何解决如何使用numpy.where查找条件复杂的索引?

# A JPG for example with RGB
x = np.zeros(shape=[5,5,3]) 
x[1,1] = np.array([1,2,3])

def rgb_equals(a,b,tolerance=0):
    return np.max(np.absolute(np.subtract(a,b))) <= tolerance

我看过这个StackOverflow示例: Numpy.where uses

numpy.nonzero(numpy.all(x == (1,1,1),axis=1))[0]

但这只是做一个简单的'=='。
较复杂的rgb_equals怎么样?

我知道我需要创建一个布尔数组以传递到numpy.where,但是StackOverflow示例仅比示例简单(小于/大于):Creating a boolean array by testing if each element in numpy array is between 2 numbers

谢谢!

解决方法

In [82]: x = np.zeros(shape=[5,5,3])
    ...: x[1,1] = np.array([1,2,3])
    ...: 
In [83]: x
Out[83]: 
array([[[0.,0.,0.],[0.,0.]],[[0.,[1.,2.,3.],# the nonzero pixel
        [0.,0.]]])

寻找非零像素:

In [84]: x==[1,3]
Out[84]: 
array([[[False,False,False],[False,False]],[[False,[ True,True,True],# the pixel
        [False,False]]])
In [85]: (x==[1,3]).all(axis=2)
Out[85]: 
array([[False,# the pixel
       [False,False]])

为此使用nonzero

In [86]: np.nonzero((x==[1,3]).all(axis=2))
Out[86]: (array([1]),array([1]))
In [87]: x[np.nonzero((x==[1,3]).all(axis=2))]
Out[87]: array([[1.,3.]])

寻找该像素的其他方法:

完全匹配:

In [95]: np.linalg.norm(x-[1,3],axis=2)
Out[95]: 
array([[3.74165739,3.74165739,3.74165739],[3.74165739,3.74165739]])

但与[1,1,1]的匹配不是很好:

In [96]: np.linalg.norm(x-[1,1],axis=2)
Out[96]: 
array([[1.73205081,1.73205081,1.73205081],[1.73205081,2.23606798,1.73205081]])

In [98]: np.max(np.abs(x-[1,3]),axis=2)
Out[98]: 
array([[3.,3.,[3.,3.]])

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。