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


77

我有一个列表,说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)  

有人可以帮我吗?


2
我想我们需要使用np.flatten()
Aditya

2
展平会使数组的形状变形。
neel

1
您希望它处于什么形状?您正在尝试从3D数组列表中创建一个新数组,因此最终的数组可能是3D或4D。您可能会np.dstack(或np.hstacknp.vstack)到达某个地方。

我已经检查过,所有元素都是3D形状(224,224,3)
尼尔

你能告诉我们的输出sum([item.size for item in temp_list])吗?

Answers:


81

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

也就是说,冒犯元件的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)
>>> 

好的,这可以回答导致错误的原因以及解决方法。我遇到了同样的问题,但就我而言,我是使用tensorflow将原始图像直接转换为np.array。因此,我没有特权将其转换为.astype(object),如下面@YinJie Gao所述。TIA
Shashank Shukla

9

是的,确实@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大小也必须相同。


1
感谢您提供此附加信息。我的问题是正如您提到的那样,内部ndarray的形状不同。
沉亚伦

2
感谢您的添加,我偶然发现了这个确切的问题。有趣的是,如果您在第二种情况下切换20和200/201,它会起作用,我发现这很令人困惑。在这种情况下,Numpy不会创建3D数组,而是创建包含2D数组的1D数组。因此,行为与看似无辜的变化完全不同。说实话有点沮丧。
塞诺(Cerno)'18

7

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

这将起作用:

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

2

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

我遇到了同样的问题。我有2450张图像的数据集。我只是不知道为什么我要面对这个问题。

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

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

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

1

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

    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])

1

这个方法并没有需要修改或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的答案中所述的空白并在以后删除多余的项目,就可以了。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.