python-numpy-ValueError: The truth value of an array with more than one element is ambiguous.

一、问题背景

作者本人想要测试一下图片数据集的RGBA通道模式下的A通道的数值, 看是不是所有图片的不透明度都是1。

于是我用了下面的代码进行测试:其中train_dataset的第1维长度为2,分别是包括了batch_size个图片的特征和对应的labels;而图片特征对应的ndarray的shape是(16,224,224,4),分别对应batch_size,height,weight,RGBA。

第一个方法,使用!=进行测试,警报【ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()】。

这个警报为什么存在?因为生成的是一个包括真假boolean值的数组,无法通过一个数组来判别真假,只能用数组中的某一个元素来判别真假,所以编译器建议你用any()或all()来处理。

python-numpy-ValueError: The truth value of an array with more than one element is ambiguous._第1张图片

第二个方法,使用python自带的any()进行测试:又报错了,这是为啥呢?这一次的测试是我最懵逼的一次,为啥也会报错呢?不明白原因,所以我进行了本文第二部分的实验。

for i,data in enumerate(train_dataset.as_numpy_iterator()):
    if i < 2:
        # if data[0][:,:,:,3] != 1:
        #     print(data[0][:,:,:,3])
        print(any(data[0][:,:,:,3] != 1))  # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
        # print((data[0][:,:,:,3] != 1).any())
        # print(data[0][:,:,:,3])
        print(data[0].shape)
        print(dir(data))
        print(data.__len__())

第三个方法, 使用ndarray的any()方法进行测试:这次是正常的。两个batch的图片,得到的不透明度值,全部都是1,所以都返回了False。

for i,data in enumerate(train_dataset.as_numpy_iterator()):
    if i < 2:
        # if data[0][:,:,:,3] != 1:
        #     print(data[0][:,:,:,3])
        # print(any(data[0][:,:,:,3] != 1))
        print((data[0][:,:,:,3] != 1).any())
        # print(data[0][:,:,:,3])
        print(data[0].shape)
        print(dir(data))
        print(data.__len__())
        
# False
# (16, 224, 224, 4)
# ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
# 2
# False
# (16, 224, 224, 4)
# ['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index']
# 2

二、解决方法

下面给出我做实验的代码:

import numpy as np

list1 = [[1,2],[3,4]]
list2 = [1,2,3,4]
arr1 = np.array([1,2,3,4])
arr2 = np.array([[1,2],[3,4]])

print(any(list1))
print(any(list2))  # 对于python内置的数据类型,不管是几个维度,都是允许用any()快速进行判断的
print(any(arr1))  # 一维的ndarray允许使用Python内置的any()函数进行判断,如果是多维的数组,就出出现下面的错误
print(any(arr2))  # ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()


# True
# True
# True

 

通过上面的实验可以看出,这个错误什么时候会发生?

第一种是用一个数组来判断真假,第二种是用Python自带的any()或all()来判断多维数组的真假。

你可能感兴趣的:(Python,python)