我最近发现了这部分代码:
filteredImage = image > filters.threshold_otsu(image)
在大多数语言中,image > filters.threshold_otsu(image)
会返回true
或false
。在这种情况下,filteredImage
为ndarray
。那么这段代码到底发生了什么?
答案 0 :(得分:5)
Python允许运算符重载。因此,您最好查阅特定用例的文档 - 这里有一个布尔掩码,正如评论所指出的那样,但python允许您使用任何运算符来做几乎任何您喜欢的事情。
例如,如果您实现了自己的数组类,则可以使用WITH cte AS (
SELECT c1
FROM t1
)
SELECT *
FROM t1
WHERE EXISTS(SELECT 1 FROM cte) -- Only return rows from outer query if there are rows in your cte "table"
来确定一个数组是否比另一个数组长。最好的办法是搜索特定用例的文档并查找运算符。
想象一下,我创建了一个名为train的类,它只包含一个字符串,我想用>
将两列火车粘在一起。 (看起来这样做很好:P)
>
哪个会输出
class Train:
def __init__(self, cargo):
self.cargo = cargo
def __call__(self):
print("__{0}__".format(self.cargo))
def __gt__(self, another):
self.cargo = "{0}__{1}".format(self.cargo, another.cargo)
# Make two trains
a = Train("check")
b = Train("me")
a()
b()
# Join the trains and print again
a > b
a()
b()
请注意,我没有使用它来返回true或false,我甚至没有让操作员返回任何内容。对我来说,在我提供的任何文档中记录这一点非常重要,以告诉您__check__
__me__
__check__me__
__me__
符号的预期用例对我的班级来说是什么。
这是一个非常有用的功能,可以一直使用(例如在numpy库中的乘法 - python可以原生地将numpy.arrays增加)。
答案 1 :(得分:1)
因为你指出它是一个ndarray,numpy使用元素明智比较的矢量化实现并返回一个布尔掩码,它也将是一个numpy数组。一个例子:
a = np.array([1,2,7,8,9])
b = np.array([1,2,3,4,5])
a <= b
array([ True, True, False, False, False], dtype=bool)
如果使用1D阵列的for循环完成,则几乎相当于以下内容:
k = []
for i,j in zip(a,b):
k.append(i<=j)
k = np.array(k)
array([ True, True, False, False, False], dtype=bool)
Numpy几乎支持所有运营商。有关更多信息和逻辑功能,您可以查看Documentation