【问题标题】:How to save many np arrays of different size in one file (eg one np array)?如何在一个文件中保存多个不同大小的 np 数组(例如一个 np 数组)?
【发布时间】:2020-01-24 00:08:34
【问题描述】:

我想在一个文件中保存几个不同形状的 numpy 数组(使用 python 2.7)。

a_1.shape = [4,130]

a_2.shape = [4,39]

a_3.shape = [4,60]

我可以创建一个包含所有数组的列表,如下所示:

list=[a_1, a_2, a_3]

但是当我尝试保存它或用它制作一个 np.array 时......

all=np.array(list)

np.savetxt('./a_list',list)

...它返回错误:

could not broadcast input array from shape (4,39) into shape (4)

有没有其他方法可以保持单个数组的形状?

谢谢!

【问题讨论】:

  • savetxt 旨在以整洁的 csv 表格格式保存 one 二维数组。你期待什么?引发错误的是np.array(list) 步骤。您可以加入数组以制作一个 (4, 130+39+69) 数组。或者通过savez 单独保存它们(制作一个 zip 存档)。
  • 我想要的是一个类似于savetxt 的函数,但允许保存这个多维numpy 数组(实际上更类似于np.save)。它不必生成 csv 格式。加入数组将导致 (4,229),因此不会保存分离。我会检查 savez - 谢谢!

标签: arrays python-2.7 numpy save


【解决方案1】:

我使用 pickle 将大量 numpy 数组保存在一个 np 数组中,作为 python 2.7 的外部 .pickle 文件。下面是一个例子,

import numpy 
import pickle
arr=numpy.array([numpy.array([1,2,3,4]),numpy.array([5,6,7,8])])
#saving arr as a .pickle file externally, wb-write binary
pickle.dump(arr,open("C:/Users/nick/Desktop/2darrays.pickle","wb"))

#Below is to read and retrieve its contents, rb-read binary
with open("C:/Users/nick/Desktop/2darrays.pickle", "rb") as f:
    X = pickle.load(f, encoding="latin1") 
print(X)

得到的输出是,

[[1 2 3 4]
 [5 6 7 8]]

希望这会有所帮助。

【讨论】:

    【解决方案2】:

    致谢:https://tonysyu.github.io/ragged-arrays.html

    以你的为例,

    import numpy as np
    
    def stack_ragged(array_list, axis=0):
        lengths = [np.shape(a)[axis] for a in array_list]
        idx = np.cumsum(lengths[:-1])
        stacked = np.concatenate(array_list, axis=axis)
        return stacked, idx
    
    def save_stacked_array(fname, array_list, axis=0):
        stacked, idx = stack_ragged(array_list, axis=axis)
        np.savez(fname, stacked_array=stacked, stacked_index=idx)
    
    def load_stacked_arrays(fname, axis=0):
        npzfile = np.load(fname)
        idx = npzfile['stacked_index']
        stacked = npzfile['stacked_array']
        return np.split(stacked, idx, axis=axis)
    

    然后

    >>> array_list = [a_1,a_2,a_3]
    >>> save_stacked_array('file.npz',array_list,axis=1)
    
    # for loading
    >>> array_list = load_stacked_array('file.npz',axis=1)
    
    

    对于更高的维度,您可以更改轴

    【讨论】:

      猜你喜欢
      • 2021-08-21
      • 2016-09-06
      • 2022-07-08
      • 2018-08-28
      • 2022-09-26
      • 2020-02-19
      • 2022-01-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多