2016-04-22 81 views
3

我有一个很大的图像数据集。当我使用图像时,我有几个组件 - 镜像图像,常规图像,特征向量矩阵和特征值向量。使用numpy.save保存Numpy 2D数组列表(阵列一起形成锯齿)

我想将其存储,如:

training_sunsets_data = [cropped_training_sunsets, 
         mirrored_training_sunsets, 
         rgb_cov_eigvec_training_sunsets, 
         rgb_cov_eigval_training_sunsets] 

np.save('training_sunsets_data',training_sunsets_data) 

当我在写这个我是测试它(因为我相信它会失败),而最奇怪的事情发生了我这样做的时候:它工作。另外,当我将它装回代码时,它是类型ndarray,但它是一个锯齿状的数组。


如果numpy不允许锯齿状多维数组,这怎么可能?我刚刚找到一种后门的方式在numpy中创建锯齿状数组吗?

+0

你可以发布你从加载文件中得到的锯齿状的'ndarray'吗?我很好奇看到它的样子。 – gdlmx

+1

看看'np.savez'。通过名称将每个数组保存在一个文件中,并将其收集到一个“zip”档案中。 'np.load'处理那种类型的存档。 – hpaulj

回答

3

我的机器上试验后:

import numpy as np 
    np.save('testnp.npy', [[2,3,4],[1,2]]) 
    np.load('testnp.npy') 
    # array([[2, 3, 4], [1, 2]], dtype=object) 

如示例中代码所示,加载的对象是ndarray类型的,但它的数据类型是object。这意味着,np.save存储一个python对象数组,它可以是任何东西。根据文档,它似乎使用python pickle来打包这些对象。

所以你没有发现后门,它的行为和预期的一样。

+0

......如果你愿意的话,你也可以使用pickle来存储数组的集合/序列。 – mdurant

+0

哦。在那里我想我找到了一些很酷的东西 – bordeo

0

因此,看看你在让我们运行一些代码。

>>> a =[np.array([[1,2,3],[4,5,6]]),np.array([[1,2],[3,4]])] 
>>> type(a) 
<type 'list'> 
>>> np.array(a) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: could not broadcast input array from shape (2,3) into shape (2) 

我们在这里看到,我们完全能够制作不同维度的np.arrays列表。然而,我们不能将该列表转换为np.array。

我怀疑根据你的语法,你正在保存一个列表,并加载列表中的每个元素维护np.array类型的列表。