一、问题背景
作者本人想要测试一下图片数据集的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自带的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()来判断多维数组的真假。