2016-04-22 112 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類型的列表。