2017-09-04 37 views
1

我只是想將項目添加到列表中,我不能!我的代碼:爲什麼我無法正確地將項目添加到Python列表中?

import numpy as np 
    data = [[]] * 10 
    for i in range(0, len(data)): 
     slice = np.random.randn(100, 100, 3) 
     print('before: ', np.shape(data)) 
     print('slice: ', np.shape(slice)) 
     data[i].append(slice) 
     print('after: ', np.shape(data)) 

結果如下:

before: (10, 0) 
slice: (100, 100, 3) 
after: (10, 1, 100, 100, 3) 

... 

before: (10, 0) 
slice: (100, 100, 3) 
after: (10, 10, 100, 100, 3) 

所以,(100,100,3)未在data[0]插入到正確的位置,但創建額外的尺寸!爲什麼?我該如何避免它?

結果列表的正確的尺寸應爲(10,,100,100,3) - 不(10,10 ,100,100,3)。

+1

'數據=名單()'然後'data.append(片)' – Sraw

+0

或'數據[i] = slice' – Sraw

+0

你只需要確保數據只包含10時它被初始化。然後你可以追加。 –

回答

2

主要的罪魁禍首是

data = [[]] * 10 

從而創建一個空的列表,並複製它更多的9倍,因此,實際上要插入到同一列表的10倍。例如:

In [113]: data = [[]] * 10 

In [114]: data[0].append(1) 

In [115]: data 
Out[115]: [[1], [1], [1], [1], [1], [1], [1], [1], [1], [1]] 

您應該

  1. 創建一個佔位符列表,然後插入在第i個元素,或
  2. 創建一個空列表[]並調用.append

但不是兩者都有。

我會建議宣佈一個空list

data = [[] for _ in range(10)] 

現在,調用.append在循環:

data.append(slice) 

您可以將結果轉換爲使用data = np.array(data)數組。這裏有一個例子:

data = [[] for _ in range(10)] 

for i in range(0, len(data)): 
    slice = np.random.randn(100, 100, 3) 
    data[i].append(slice) 


print(np.array(data).shape) 
(10, 1, 100, 100, 3) 
+0

data [i] = slice將不起作用,因爲我想爲每個數據[i]添加許多'切片'!使用我的代碼,當我試圖添加10個切片時,它會添加10 * 10個切片。 – Dmitry

+0

@Dmitry這是因爲你正在使用'data = [[]] * 10'創建一個列表並複製它9次,所以你訪問同一個列表10次。在我的回答中,我列出了一些替代方案。 –

+0

我剛剛修復了我的問題中的嚴重錯誤。你現在看到我的問題了嗎? – Dmitry

相關問題