Python 将numpy一维阵列重塑为三维阵列

Python 将numpy一维阵列重塑为三维阵列,python,numpy,tensorflow,keras,Python,Numpy,Tensorflow,Keras,我在将numpy阵列从1D重塑为3D时遇到问题 我在看一个视频文件, 然后,我从x个帧中提取人脸,并将人脸及其标签存储在numpy数组中 fps = 3 time_of_video = 10 x = 0 face_size = 128 images = [] labels = [] for original_name, filename, label in tqdm(zip(train_sample_metadata['original'], train_sample_metadata['f

我在将numpy阵列从1D重塑为3D时遇到问题

我在看一个视频文件, 然后,我从x个帧中提取人脸,并将人脸及其标签存储在numpy数组中

fps = 3
time_of_video = 10
x = 0
face_size = 128

images = []
labels = []

for original_name, filename, label in tqdm(zip(train_sample_metadata['original'], train_sample_metadata['filename'], train_sample_metadata['label'])):

...

        video_1 = read_video(f'{base_path}/{filename}', fps*time_of_video)
        video_2 = read_video(f'{base_path}/{original_name}', fps*time_of_video)
        face_annotations = get_annotations(real_video)
        faces_1 = crop_faces(video_1, face_annotations, face_size)
        faces_2 = crop_faces(video_2, face_annotations, face_size)

        x = faces_1

        for ff, rf in zip(faces_1, faces_2):
            if np.array_equal(ff, rf):
                y.append(0)
            else:
                y.append(1)

        y = to_categorical(np.array(y), 2)

    images.append(x)
    labels.append(y)


images = np.array(images)
labels = np.array(labels)

images.shape, labels.shape
((400,), (400,))

images = images.reshape((images.shape[0] * images.shape[1], 128, 128, 3))
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-38-af9e927f8a1c> in <module>
----> 1 images = images.reshape((images.shape[0] * images.shape[1], 299, 299, 3))

IndexError: tuple index out of range
fps=3
视频的时间=10
x=0
面_尺寸=128
图像=[]
标签=[]
对于原始名称、文件名、TQM中的标签(zip(列车样本元数据['original'],列车样本元数据['filename'],列车样本元数据['label']):
...
video_1=读取_视频(f'{base_path}/{filename}',fps*视频的时间_)
video_2=读取_视频(f'{base_path}/{original_name}',fps*时间_的_视频)
面部注释=获取注释(真实视频)
面_1=裁剪面(视频_1、面_注释、面_大小)
面_2=裁剪面(视频_2、面_注释、面_大小)
x=面_1
对于ff,拉链中的rf(面_1,面_2):
如果np.数组_相等(ff,rf):
y、 追加(0)
其他:
y、 附加(1)
y=to_分类(np.数组(y),2)
images.append(x)
标签。附加(y)
images=np.array(图像)
labels=np.array(标签)
图像.形状,标签.形状
((400,), (400,))
images=images.reformate((images.shape[0]*images.shape[1,128,128,3))
---------------------------------------------------------------------------
索引器回溯(最后一次最近调用)
在里面
---->1 images=images.restrape((images.shape[0]*images.shape[1,299299,3))
索引器错误:元组索引超出范围

您的
图像
数组可能是形状(400),因为原始列表不包含所有相同的形状。假设您的图片/视频在5D中具有正确的表示形式,如果所有附加项的大小相同,它将转换为
numpy
数组。但事实并非如此。尝试:

for i in images:
    print(np.array(i.shape))
运行此行时,您可能会发现列表被转换为列表数组的原因:

images = np.array(images)
重塑
功能仅重新排列当前数组。想象一个2x2x2的立方体,共有8个单位。阵列只能使用这8个单元进行重塑

正如我所说,如果你发现不是所有的图片阵列都是相同的形状,你将无法将它们重塑为相同的形状。您需要裁剪或调整大小。您可以使用
PIL
及其
Image
模块来实现这一点

from PIL import Image

pic = Image.fromarray(pic).resize((128, 128, 3))

可以使用将单通道图像转换为三通道图像

image3Channel=np.stack((image1Channel,)*3, -1)

如果
图像
是一维的,那么您对
图像.shape[1]
的期望是什么?在将其存储到
x
之前,您是否检查了
面中包含的内容?我猜它不是一个numpy数组。我试图制作的形状是images.shape[1],128,128,3)``images.shape,labels.shape((400,),(400))images=images.reforme((images.shape[0]*images.shape[1],128,128,3))`@OscarRangel我看到了。这就是我的问题
images
是一维的,但是你可以访问第一维和第二维的大小(
images.shape[0]
images.shape[1]
)。谢谢你的帖子,我明白你的意思了,所以最初的对象是一个列表,然后我创建了np列表,但是我是如何将它变成一个128,3个阵列,以便我可以训练模型。您是否确保所有图片都可以重塑为(128,128,3)?或者你想调整尺寸?因为您使用了正确的方法将列表转换为
numpy
数组,但我怀疑某些形状不匹配。如果形状不匹配,你必须调整大小,而不是重塑。对不起,我还在学习。。。。您将如何调整大小?如果我调整尺寸,我就不必再做整形了?另外,它告诉我索引超出范围。非常感谢这篇文章,所以我必须对每一张图片都这样做,然后将所有图片存储在np数组中,我不需要重塑,对吗?没错。但是,如果所有图片的形状相同,并且可以重塑为所需的大小,则首选重塑。我希望你能理解其中的细微差别。谢谢,但是images=np。stack((images,)*3,-1)不起作用。。。。images.shape(400,3)images=images.reshape((images.shape[0]*images.shape[1,128,128,3))值错误:无法将大小为1200的数组重新形状化为形状(1200128128,3)您可以轻松地使用opencv进行
cv2.resize(images.3channel,(128128),interpolation=cv2.INTER\u AREA)
TypeError:参数“%s”应为Ptr。您可以将其更改为
cv2.resize(np.float32(image3channel),(128128),interpolation=cv2.INTER\u AREA)
image=cv2.resize(np.float32(images),(128128),interpolation=cv2.INTER\u AREA)值错误:使用序列设置数组元素。