【问题标题】:Getting an error while using and operator in python [closed]在python中使用和运算符时出错[关闭]
【发布时间】:2021-09-15 07:24:58
【问题描述】:

我想使用 for 循环提取我的目录中存在的 2 张照片。在每次迭代中,它都会带来一张照片。获得两张照片后,另一个 if 语句将触发并打印“成功从目录中提取的两张图像”。这是代码 ==>

import cv2

import os

import re

from skimage.io import imread,imshow,imsave

images =os.listdir('D:\programs python/regeneration\Mi3_Aligned/1')

img = None

ref_img = None

for i in images:

    if i == "1.bmp":

        img = imread('D:\programs python/regeneration\Mi3_Aligned/1/' + i)

        img = cv2.resize(img, (980, 980), cv2.INTER_AREA)

    if i == "2.bmp":

        ref_img = imread('D:\programs python/regeneration\Mi3_Aligned/1/'+ i)

        ref_img = cv2.resize(img, (980, 980), cv2.INTER_AREA)

    if (img!=None and ref_img!=None):

        print("Both images extracted from directory successfully")

但它正在产生错误,我无法理解问题所在

if (img!=None and ref_img!=None):
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

请帮忙!!!

【问题讨论】:

  • 通常最好使用is not None 而不是!=None
  • 不是直接回答您的问题,而是您为什么将\/ 混合在'D:\programs python/regeneration\Mi3_Aligned/1/' 中(为什么您对该路径进行了三次硬编码)?
  • 错误信息你不清楚怎么办?
  • @khelwood 请将其转化为答案。这是第一个正确答案,也是迄今为止唯一正确的答案。
  • @ChristophRackwitz 你为什么不回答?

标签: python arrays opencv scikit-image


【解决方案1】:

你可以通过改变来解决这个问题

if (img!=None and ref_img!=None):

if img is not None and ref_img is not None:

数组有一个==!= 的实现,它返回另一个数组而不是单个布尔值。但... is not None 总是会评估为真或假。

【讨论】:

  • 关键是==!=做了一个“值比较”。 numpy 数组实现了这种行为。 isis not 比较是“身份比较”。它检查 objects 是否是 same(在这种情况下为 None),而不查看这些对象中的值。
【解决方案2】:

错误提示您,您正在尝试比较一个数组变量。

docs for imread() 表示它返回一个数组。

您可以利用 Python 中的空数组是错误的这一事实,而不是与 None 进行比较。

if img and ref_img:
    print('Both images extracted from directory successfully')

【讨论】:

  • 你不能做bool(some_nparray)。对于实际数组(None 不是数组),它会拒绝并抛出问题中的错误。 Python 没有 && 运算符。即使img and ref_img 也不起作用,因为它只是给出与问题相同的错误。 img & ref_img 也将不起作用,因为它只是尝试按元素进行 按位与,这会产生一个数组,它不会自行“衰减”为真/假
  • @ChristophRackwitz 我的意思是and。我忘了是 Ruby 更喜欢 && 而不是 and,而不是 python(已修复)。我刚刚尝试了一个带有两个空数组的 REPL,它们肯定是错误的。根据文档,有问题的库返回普通数组,而不是 numpy 数组,所以这个解决方案可以正常工作。
  • cv2.resize 返回一个 numpy 数组,这就是检查这些变量时的内容。如果这些对象是常规 python 列表,则不会出现来自问题的错误消息。 python 列表没有.any.all 方法。这绝对表明numpy。甚至 scipy.io.imread 调用也会返回一个ndarray。你怎么能声称涉及到常规的 python 列表?
  • @ChristophRackwitz 你真的应该做出自己的答案,因为你显然有更多的洞察力。 numpy 数组的解释以及 cv2.resize 返回它们的事实应该在接受的答案中。
【解决方案3】:

问题源于数组和不同类型的变量/值之间的比较。我建议改用这个:

if img and ref_img:
    print("Both images extracted from directory successfully")

如果省略要比较的变量,python 只会检查值是否为空/无。

【讨论】:

  • 不起作用。如果两者都是 np.arrays,它们之间的and 只会抛出与问题相同的错误,因为 np.arrays 不能简单地转换为布尔值。这里需要img is not None and ref_img is not None,问题是使用!=而不是is/is not,所以是的,这源于将np.array与None进行值比较......但不,应该使用身份比较.
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 2014-08-25
  • 1970-01-01
  • 2021-10-28
  • 1970-01-01
  • 2021-11-09
  • 1970-01-01
  • 2019-06-05
相关资源
最近更新 更多