【问题标题】:What exactly does the [x](y) operator do?[x](y) 运算符到底是做什么的?
【发布时间】:2021-07-15 21:51:42
【问题描述】:

我的目标是逐像素评估图像。而不是:

count = 0
for x in range(w):
  for y in range(h):
    pixel_1, pixel_2 = img_1[x, y], img_2[x, y]
      if pixel_1 == 0 and pixel_2 == 0:
        count += 1

我已经看到了一种使用 [] 和 () 运算符的方法:

sum((img_1 == 0)[img_2 == 0])

我试图理解这意味着什么。我一直在尝试搜索它,但我不知道描述它的正确术语。我也试图一次将它应用于三个图像:

sum((img_1 == 0)[img_2 == 0 and img_3 == 0])

但这不起作用。任何帮助,将不胜感激。提前致谢。

【问题讨论】:

    标签: python image numpy opencv image-processing


    【解决方案1】:

    这条线上发生了很多事情:

    sum((img_1 == 0)[img_2 == 0])
    

    首先,img_1 == 0 是一个返回 1 的 numpy 数组的操作,其中 imp_1 不为零,否则为 0。尝试打印它以查看。该数组的保存大小为img_1。括号内的操作与img_2的操作基本相同。

    这里有 1(相当于True),而a1 中有 0:

    a1 = np.arange(2*3).reshape(2, 3)
    # array([[0, 1, 2],
    #        [3, 4, 5]])
    
    a1 == 0
    # array([[ True, False, False],
    #        [False, False, False]])
    

    img_1 == 0 周围的括号仅在此处,以便以下索引操作(由括号具体化)适用于 img_1 == 0 的结果而不是 0 数字。。这不是一种操作,而是一种对某些操作进行分组和优先处理的方法(参见@hpaulj 评论)。

    最后涉及的操作——由括号具体化的操作——是索引操作。首先注意(img_1 == 0)img_2 == 0 的大小相同(考虑到两个图像的大小相同)。 此操作仅检索 (img_1 == 0) 中的元素,其中有 0 的 in img_2 此操作根据括号内指定的索引从数组中“选择”元素。

    a 在不同的位置有三个 1。该操作仅检索aa == 1 为真的元素,因此它返回三个元素:

    a = np.array([[1, 2, 1], [3, 1, 4]])
    a[a == 1]
    # array([1, 1, 1])
    

    这种求和运算不是最容易理解的形式,您可以将其用于您的 3-image 案例:

    ((img1 == 0) & (img2 == 0) & (img3 == 0)).sum()
    

    这读起来很好:“创建一个包含 1 的 1 和 0 的 numpy 数组,其中 imag1 中有 0 并且 img2 中有 0 并且 ...,然后对这个数组求和”。

    【讨论】:

    • 非常感谢!这很有帮助!当我打印 img_1 == 0 时,我确实注意到结果数组具有相同的维度 (ndim = 2),并且 (img_1 == 0)[img_2 == 0] 具有一维数组。所以只是确认一下,(img_1)[img_2] 是img_1 和img_2 的点积吗?
    • 我还想知道为什么我的迭代方法返回的总和与括号/括号表示法不同。有意义的是,如果 [img_1 == 0](img_2 == 0) 是点积,那么它将返回一个较小的总和,因为它也在评估 True & False == False 的答案(如果我理解正确的话)。
    • @cristina, (x)[y] 不是“点”产品。 () 只是对一个动作进行分组,并赋予它优先级。 [] 是一个索引操作。迟早你需要阅读numpy 索引。 dot 乘积(通常)是指数学乘法和求和。 numpy 有一个 np.dot@ 可以做到这一点。
    猜你喜欢
    • 2016-02-14
    • 1970-01-01
    • 2011-07-01
    • 2019-06-10
    • 2015-03-28
    • 1970-01-01
    • 2018-02-14
    • 2013-11-22
    • 2014-09-16
    相关资源
    最近更新 更多