我有一个列表说,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)
有人可以帮助我吗?
答案 0 :(得分:40)
列表中至少有一项不是三维的;或者它的(第二或第三维)与其他元素不匹配。如果只有第一个维度不匹配,则数组仍然匹配,但作为单个对象:不会尝试将它们协调为新的(四维)数组。以下是一些例子。
即,违规元素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)
>>>
答案 1 :(得分:7)
是的,确实@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也必须是相同的大小。
答案 2 :(得分:1)
@ aravk33的答案是绝对正确的。
我遇到了同样的问题。我有一个2450张图像的数据集。我只是不知道为什么要面对这个问题。
检查训练数据中所有图像的尺寸。
在将图像添加到列表中时添加以下代码段:
if image.shape==(1,512,512):
trainx.append(image)
答案 3 :(得分: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])
答案 4 :(得分:1)
此方法不需要不需要修改dtype或修饰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的答案中所述的空白并在以后删除多余的项目,就可以了。
答案 5 :(得分:0)
您可以使用numpy.ndarray
到object
到astype(object)
这将起作用:
>>> a = [np.zeros((224,224,3)).astype(object), np.zeros((224,224,3)).astype(object), np.zeros((224,224,13)).astype(object)]