【问题标题】:How to save to disk several 2D np.arrays each having the second dimension variable in size?如何将几个 2D np.arrays 保存到磁盘,每个 2D np.arrays 的大小都具有第二维变量?
【发布时间】:2021-05-27 09:05:45
【问题描述】:

我得到了一些大小为 (no_of_rows, 2) 的 np.arrays 形式的结果,其中 no_of_rows 因数组而异。

我想将这些结果保存到磁盘以供以后使用(绘图)。无论如何,这并不重要,但如果可能的话,以最有效的方式重新打开/使用耗时的方式。

我可以用这些二维数组做任何事情。我的想法是创建一个 .npy 文件,其中包含一个 3D 张量形状 (no_of_matrices, ? , 2),但是呢?是我的问题。每个二维数组都可能有不同的no_of_rows。所以我放弃了这个想法。

我现在列出了这些 2D np.arrays。我现在想将该列表保存到磁盘。 我已经阅读了有关np.savez 的信息,但这并不能保留保存的顺序。也就是说,当加载回内存时,我不知道哪个数组是哪个数组,除了许多 if 语句来检查每个数组的 no_of_lines 并将其与稍后绘制时的含义相匹配。

我是否有机会将这些数组存储在 1 个 SINGLE 文件中,还是我只需要创建多个文件,以独特的方式命名,每个 2D 数组一个,然后在绘图时单独访问这些文件?

[PS:我最多只能有 100 个这样的二维数组,通常少于 10 个。]

谢谢

【问题讨论】:

    标签: python arrays numpy file-io data-science


    【解决方案1】:

    您可以使用带有键参数的 npz 来识别每个数组,从而不再有不保留顺序的问题。

    a = np.arange(10)
    b = np.arange(5)*-1
    
    f1={'my_key1':a}
    f2={'my_key2':b}
    
    np.savez_compressed('my_archive.npz', **f1, **f2)
    

    按如下方式阅读您的存档:

    >>>print(np.load('my_archive.npz')['my_key2'])
    [ 0 -1 -2 -3 -4]
    

    编辑

    如 cmets 中所述,如果我们想自动注册 N np.arrays,上述解决方案是不可行的。 因此,解决方案是创建一个包含 N 个条目的字典:

    f = {}
    f['my_key1'] = a
    f['my_key2'] = b
    
    np.savez_compressed('my_archive.npz', **f)
    

    【讨论】:

    • 谢谢。您对以编程方式定义 f 有什么想法吗?我现在正在基于索引 i 的 for 循环中尝试 'f_%d' % i = {names[i] : final_coords_at_detectorscreen_container[i]},但它不起作用:SyntaxError: cannot assign to operator。我想这样做:np.savez_compressed('my_archive.npz', **something_based_on_the_fs) 显然,如果我的列表中有超过 5 个数组,按照帖子中介绍的方式,你的答案是不可行的。
    • 好的,我现在有一个列表,里面有你模仿的字典,l = [{}, {}, ...]。我现在正在尝试将np.savez_compressednp.savez_compressed('filename.npz', **l[i] for i in range(len(l))) 一起使用,但它不起作用。
    • 好的,通过将所有内容放入包含许多键值对的 1 个大字典中来进行保存,因为我发现 1 个字典只有 1key-1value (就像你对 f1 和 @987654332 所做的那样@) 有点多余。然后我将np.savez_compressed() 命令中的大字典解压缩为np.savez_compressed('filename.npz', **big_dict),然后访问np.load('filename.npz')[key],其中key 来自保存在大字典中的所有键的列表。
    • 使用单个字典是正确的解决方案。运算符 ** 允许您添加每个元素及其关联的键
    【解决方案2】:

    您可以将这些二维数组保存为 CSV 文件。

    将所有数组连接成一个由您决定:您可以将所有数组连接成一个并仅保存一个文件,也可以保存收到的所有数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 2022-01-07
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多