2016-08-03 69 views
1

我試圖創建下面的數據結構(這是不是最佳的,我知道,但需要給我的輸入數據)字典的名單:創建持有可變大小的數組

100個字典列表使用相同的兩個鍵「x」和「y」,其中每個鍵保存可變長度的numpy數組。 「y」包含一個矢量,「x」包含一系列圖像,因此x的示例形狀可以是10 x 3 x 10 x 50,或者10 x 50的10像素圖像。相應y的示例形狀將是10,因爲x和y的初始長度需要相同。如果我只有8個圖像,那麼y的長度也是8,等等。

我想預先初始化這個結構,所以我可以使用更改後的數據值填充它,然後這樣做,以便我可以設置大小基於單獨的一段輸入數據的每個字典的可變長度「x」和「y」數組。我知道我可以設置字典中是這樣的:

imageArray = np.zeros(10,3,10,50) 

vectorNumbers = np.zeros(10) 

output = [{'x':imageArray,'y':vectorNumbers}] 

所以應該建立一個單一的詞典,但如果我有類似與字典中的值「X」的長度數組和「y」 ,我怎麼能用這樣的事:

output = [{'x':imageArray,'y':vectorNumbers} for k in range(listLength)] 

但確保imageArray長度將[變量,3,10,50]和vectorNumbers長度將[變量],其中變量存儲在數另一個列表,我可以訪問上面的k櫃檯。

+0

這使同一陣列中的每個字典。更改一個值將會改變所有的值。我不認爲你想要那樣。您需要爲每個詞典創建一個具有正確維度的新數組。使用列表和詞典不能進行捷徑。 – hpaulj

回答

0

我假設輸入的長度列表是一對雙列表或類似的東西。

input_lengths = [(12,17), (8,50), (2,7)] 
pre_filled_list = [{'x' : [None]*x, 'y' : [None]*y} for x,y in input_lengths] 
print(pre_filled_list) 

Pre_filled列表是一個字典的列表,每個字典都有兩個鍵;每個值都是所需長度無的列表。

+0

'x'和'y'應該是4d和1d numpy數組,而不是列表。 – hpaulj

0

什麼:

import numpy as np 

dims = [(42,43), (46,9), (47,49), (60,14)] 
output = [{'x':np.zeros((x,3,10,50)), 'y':np.zeros((y,))} for (x,y) in dims] 

print(len(output))    # 4, matches len(dims) 

print(type(output[0]['x']))  # <type 'numpy.ndarray'> 
print(type(output[0]['y']))  # <type 'numpy.ndarray'> 

print(output[0]['x'].shape)  # (42, 3, 10, 50) 
           # 42 is from the first element of the first tuple in dims 
print(output[0]['y'].shape)  # (43,) 
           # 43 is from the second element of the first tuple in dims 

print(output[1]['x'].shape)  # (46, 3, 10, 50) 
print(output[1]['y'].shape)  # (9,) 

數組是在字典,這是在列表中。所有維度(我認爲)都是零。

如果你想要的東西更接近你有什麼,有range(listLength),這四條線產生相同的輸出如上:

xd = [42, 46, 47, 60] 
yd = [43, 9, 49, 14] 
listLength = 4 

output=[{'x':np.zeros((xd[k],3,10,50)),'y':np.zeros((yd[k],))} for k in range(listLength)]