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

pu82cl6c  于 2023-03-18  发布在  其他
关注(0)|答案(9)|浏览(376)

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

有人能帮帮我吗?

eulz3vhy

eulz3vhy1#

列表中至少有一个项不是三维的,或者其第二维或第三维与其他元素不匹配。如果只有第一维不匹配,则数组仍然匹配,但作为单独的对象,不会尝试将它们协调到新的(四维)数组中。下面是一些示例:
也就是说,违规元素的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)
>>>
2w3rbyxf

2w3rbyxf2#

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

fkaflof6

fkaflof63#

您可以使用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)]
neekobn8

neekobn84#

我也面临着同样的问题,因为在我的数据集中,有些图像是灰度图像,所以我通过这样做来解决我的问题

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

goqiplq25#

@aravk33的答案绝对正确。
我也在经历同样的问题。我有一个2450张图片的数据集。我只是想不通为什么我会面临这个问题。
检查训练数据中所有图像的尺寸。
在将图像追加到列表中时添加以下代码段:

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

eeq64g8w6#

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

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

f5emj3cl7#

这个方法需要修改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回答中所述差距,稍后删除多出的一项,就可以了。

axr492tv

axr492tv8#

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

打印出每一个图像的形状,然后变成这样:
~
十七〇八年:(五十、五十、三)
十七○九:(五十,五十)
1710年:(50,50)
1711年:(50,50,3)
1712年:(五十、五十、三)
1713年:(50,50,3)
~
这意味着阅读2个不同的图像文件夹并对其进行混洗后的混合1D和3D数据
img: first one is Grayscale and second one is Color image
添加了cv2.IMREAD_GRAYSCALE,问题得到解决
摘要:在我想转换成np数组的图像数据中包含了不同维度的图像

  • 〉检查图像数据
  • 〉发现有1D和3D图像
  • 〉制作3D图像灰度(1D)
  • 〉问题解决
w6mmgewl

w6mmgewl9#

我完全同意@mudassir的回答。如果你已经对你的数据集进行了推断,那么你很可能会得到这个错误。就像大多数的推断一样,它会自动应用灰度效果,实际上是二维的,而原始图片(RGB)是三维的。我自己使用的是roboflow的数据集,它已经被扩充,也有类似的问题。然后我删除了“灰度化步骤”但是它还是给出了错误。但是,一个我删除了灰度,色调和饱和度,它的工作就像一个魅力。我建议你也试试。

相关问题