繁体   English   中英

ValueError:无法将输入数组从形状 (224,224,3) 广播到形状 (224,224)

[英]ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)

我有一个列表说,temp_list 具有以下属性:

len(temp_list) = 9260  
temp_list[0].shape = (224,224,3)  

现在,当我转换成 numpy 数组时,

x = np.array(temp_list)  

我收到错误:

ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)  

有人可以在这里帮助我吗?

列表中至少有一项不是三维的,或者它的第二维或第三维与其他元素不匹配。 如果只有第一维不匹配,数组仍然匹配,但作为单独的对象,不会尝试将它们协调为新的(四维)数组。 一些例子如下:

也就是说,违规元素的shape != (?, 224, 3)
ndim != 3 (其中?是非负整数)。
这就是给你错误的原因。

您需要解决这个问题,以便能够将您的列表变成一个四(或三)维数组。 没有上下文,就不可能说是要从 3D 项目中丢失一个维度还是向 2D 项目添加一个维度(在第一种情况下),或者更改第二个或第三个维度(在第二种情况下)。


这是错误的示例:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,224))]
>>> np.array(a)
ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)

或者,不同类型的输入,但同样的错误:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,224,13))]
>>> np.array(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (224,224,3) into shape (224,224)

或者,类似但有不同的错误消息:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((224,100,3))]
>>> np.array(a)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: could not broadcast input array from shape (224,224,3) into shape (224)

但是以下方法会起作用,尽管结果与(大概)预期的结果不同:

>>> a = [np.zeros((224,224,3)), np.zeros((224,224,3)), np.zeros((10,224,3))]
>>> np.array(a)
# long output omitted
>>> newa = np.array(a)
>>> newa.shape
3  # oops
>>> newa.dtype
dtype('O')
>>> newa[0].shape
(224, 224, 3)
>>> newa[1].shape
(224, 224, 3)
>>> newa[2].shape
(10, 224, 3)
>>> 

是的,@Evert 的答案确实是完全正确的。 此外,我想再添加一个可能遇到此类错误的原因。

>>> np.array([np.zeros((20,200)),np.zeros((20,200)),np.zeros((20,200))])

这会很好,但是,这会导致错误:

>>> np.array([np.zeros((20,200)),np.zeros((20,200)),np.zeros((20,201))])

ValueError: could not broadcast input array from shape (20,200) into shape (20)

列表中的 numpy arry 也必须具有相同的大小。

您可以使用astype(object)astype(object) numpy.ndarrayobject

这将起作用:

>>> a = [np.zeros((224,224,3)).astype(object), np.zeros((224,224,3)).astype(object), np.zeros((224,224,13)).astype(object)]

我遇到了同样的问题,因为我的数据集中的一些图像是灰度图像,所以我通过这样做来解决我的问题

    from PIL import Image
    img = Image.open('my_image.jpg').convert('RGB')
    # a line from my program
    positive_images_array = np.array([np.array(Image.open(img).convert('RGB').resize((150, 150), Image.ANTIALIAS)) for img in images_in_yes_directory])

@ aravk33 的答案是绝对正确的。

我正在经历同样的问题。 我有一个包含 2450 张图像的数据集。 我只是不明白为什么我会面临这个问题。

检查训练数据中所有图像的尺寸。

在将图像附加到列表中时添加以下代码段:

if image.shape==(1,512,512):
    trainx.append(image)

这种方法不需要修改或D型你拆开阵列numpy的。

核心思想是: 1.用额外的一行进行初始化。 2.将列表(多一行)更改为数组 3.删除结果数组中的额外行,例如

>>> a = [np.zeros((10,224)), np.zeros((10,))]
>>> np.array(a)
# this will raise error,
ValueError: could not broadcast input array from shape (10,224) into shape (10)

# but below method works
>>> a = [np.zeros((11,224)), np.zeros((10,))]
>>> b = np.array(a)
>>> b[0] = np.delete(b[0],0,0)
>>> print(b.shape,b[0].shape,b[1].shape)
# print result:(2,) (10,224) (10,)

确实,不一定要多加一行,只要能摆脱@aravk33和@user707650的回答中的空白,稍后删除多余的项目就可以了。

在我的情况下,问题出在我的数据集中,基本上我需要在进一步处理之前对我的数据进行预处理,因为在我的数据集中,图像采用随机格式,如 RGB 和灰度,因此尺寸不匹配。 我只是按照Mudasir Habib 的回答。

from PIL import Image
img = Image.open('my_image.jpg').convert('RGB')

我完全同意@mudassir 的回答。 如果您已经对数据集进行了验证,则很可能会出现此错误。 与大多数增强一样,它会自动应用实际上是二维的灰度效果,而原始图片 (RGB) 是三维的。 我自己正在使用 roboflow 的数据集,该数据集已经进行了扩充并且遇到了类似的问题。 然后我删除了“graysclaing step”,但它仍然给出了错误。 然而,我删除了灰度、色调和饱和度,它就像一个魅力。 我建议你也试试。

已解决 - 我得到了同样的错误:X_test = np.array(X_test, ) ValueError: 无法将输入数组从形状 (50,50,3) 广播到形状 (50,50)

打印每个图像形状并得到这样的:

~

1708 : (50, 50, 3)

1709 : (50, 50)

1710 : (50, 50)

1711 : (50, 50, 3)

1712 : (50, 50, 3)

1713 : (50, 50, 3)

~

这意味着在读取 2 个不同的图像文件夹并将它们打乱后混合 1D 和 3D 数据

img:第一个是灰度,第二个是彩色图像

添加 cv2.IMREAD_GRAYSCALE 问题解决

摘要:在我想转换为 np 数组的图像数据中包含不同维度的图像

-> 检查图像数据

-> 发现有 1D 和 3D 图像

-> 制作 3D 图像灰度(1D)

-> 问题解决了

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM