我有一个列表,称为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
(其中 ?
是非负整数)。
这就是导致错误的原因。
您需要修复它,才能将您的列表转换为四维(或三维)数组。没有上下文,无法确定您是想从三维项目中减少一个维度还是在二维项目中增加一个维度(在第一种情况下),或更改第二或第三维度(在第二种情况下)。
>>> 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))])
这样做是完全没有问题的。然而,这会导致ValueError
:
>>> 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
数组也必须具有相同的大小。
astype(object)
将 numpy.ndarray
转换为 object
。>>> 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])
if img.shape == (width, height, 3):
条件,以排除任何灰度图像。这对其他新手可能会有所帮助。 - undefinedfrom PIL import Image
img = Image.open('my_image.jpg').convert('RGB')
@aravk33的答案是完全正确的。
我也遇到了同样的问题。我的数据集中有2450张图片,我就是弄不清楚为什么会出现这个问题。
检查你训练数据中所有图像的尺寸。
将以下代码片段添加到将图像附加到列表中的代码中:
if image.shape==(1,512,512):
trainx.append(image)
这种方法不需要修改numpy数组的dtype或ravel。
核心思想是: 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 的答案中提到的间隙,并稍后删除多余的项目,就可以了。
打印出每个图像的形状,得到如下结果:
~
1708: (50, 50, 3)
1709: (50, 50)
1710: (50, 50)
1711: (50, 50, 3)
1712: (50, 50, 3)
1713: (50, 50, 3)
~
这意味着读取两个不同的图像文件夹并将它们洗牌后混合1D和3D数据。 img:第一个是灰度图像,第二个是彩色图像 添加了cv2.IMREAD_GRAYSCALE,问题得到解决。x = np.emtpy(len(temp_list), dtype=object)
for i, arr in enumerate(temp_list):
x[i] = arr
np.dstack
(或np.hstack
或np.vstack
)可能会有所帮助。 - user707650sum([item.size for item in temp_list])
的输出结果吗? - user707650