numpy 将元组列表保存到NPZ文件

uinbv5nw  于 2023-06-23  发布在  其他
关注(0)|答案(1)|浏览(97)

我的目标是加载、更改和保存NPZ文件。我正在加载的文件返回5个不同的密钥。其中4个键的类型是np.array,而最后一个键是一个元组列表。下面是其中一个元组的示例:
(array([1967,2929]),0.23312236286919832,array([888.117,387.693,851.922,124.948]))
我在保存npz文件时遇到了麻烦,因为这个元组列表不能转换成numpy数组,而numpy数组是保存NPZ文件所必需的。将列表转换为数组将返回以下错误:
ValueError:使用序列设置数组元素。请求的数组在二维后具有不均匀的形状。检测到的形状为(44601,3)+不均匀部分。
有人知道如何处理这个问题吗?
下面是我的代码:

import numpy as np
from numpy import load
import os

directory = '/MY_PATH/scene_info_0.1_0.7'

for filename in os.listdir(directory):
    f_npz = os.path.join(directory,filename)
    data = load(f_npz, allow_pickle = True)
    print(type(data))
    for image_path in data['image_paths']:
        if image_path is not None:
            if 'Undistorted_SfM' in image_path:
                image_path = image_path.replace('Undistorted_SfM', 'phoenix/S6/zl548/MegaDepth_v1')
            else:
                print("Undistorted_SfM NOT IN IMAGE PATH??")
    
    data['pair_infos'] = np.asarray(data['pair_infos'])
    new_file = '/MY_PATH/npz_mess/' + filename
    np.savez(new_file, data['image_paths'], data['depth_paths'], data['intrinsics'],data['poses'],data['pair_infos'])
    print("Saved to ", new_file)
ogsagwnx

ogsagwnx1#

正如hpaulj在注解中所指出的,您希望在这里指定object的dtype,在此之后,您的代码应该可以正常运行。下面的再生器运行干净。

import numpy as np

my_tuple_list = np.array([(np.array([1967, 2929]), 0.23312236286919832, np.array([888.117, 387.693, 851.922, 124.948])),(np.array([1,2,3]),5)],dtype=object)

np.savez('file.npz',dta1=np.zeros([5,5]),dta2=my_tuple_list)
loadback = np.load('file.npz', allow_pickle=True)
np.savez('file2.npz',dta1=loadback['dta1'], dta2=loadback['dta2'])

相关问题