2016-01-12 47 views
2

我有需要的形狀轉動非對稱的3維列表成列表的一個2維列表在python

[[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 

,當變成numpy的陣列變得

[[1 1],[2 2 2]], 
[[3 3 3],[4 4],[5 5 5]] 

列表所以要清楚,我有一個由2個列表組成的列表,每個列表都由列表組成

我想把它放在表格中

[[1,1],[2,2,2],[3,3],[4,4],[5,5,5]] 

[[1,1], 
[2 2 2], 
[3 3], 
[4 4], 
[5 5 5]] 

扁平化不起作用,因爲它只是給我的每個組件的列表,但我想保持列表以相同的組件連接在一起,使我有一個列表的列表結束。這將是不同大小的列表,所以我不認爲重塑功能也可以。

另一個問題是,在我給出的例子中,列表由相同的數字組成,但在我的實際代碼中它們是不同的數字,所以我不能簡單地告訴它將所有的特定數字每個列表。

我希望我清楚,如果沒有,我會嘗試和澄清

+0

雖然是可以做到的,使用numpy的同類型的數組'object'(無糖形狀規則行)輸大多數numpy的目的(速度,usabillity,'ufuncs'的適用性)。 –

回答

2

你可以使用兩個環路與list comprehension,它可以工作在listsnp.arrays

l = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 
result = [i for sublist in l for i in sublist] 
print(result) 
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

如果你不熟悉list comprehension你可以使用通常的循環(等效列表理解溶液):

newlist = [] 
for sublist in l: 
    for i in sublist: 
     newlist.append(i) 

print(newlist) 
[[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

編輯

或者你可以使用np.concatenatenp.hstack爲@Divakar建議這是更可讀,但性能...:

In [225]: %timeit [i for sublist in l for i in sublist] 
1000000 loops, best of 3: 885 ns per loop 

In [227]: %timeit np.concatenate(l) 
100000 loops, best of 3: 4.12 us per loop 

In [226]: %timeit np.hstack(l) 
100000 loops, best of 3: 13.3 us per loop 

EDIT2

從@hpaulj評論,你可以使用itertools.chain(*l) tp實現呼叫list

import itertools 
In [315]: list(itertools.chain(*l)) 
Out[315]: [[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]] 

In [317]: %timeit list(itertools.chain(*l)) 
1000000 loops, best of 3: 876 ns per loop 

所以結果幾乎與list comprension相同,可能會快一點。

+0

謝謝!我會在幾分鐘內接受你的答案......你能告訴我這是什麼嗎?我想查找更多關於這方面的信息。再次感謝你! – Alex

+0

請按照編輯答案中的鏈接 –

+0

謝謝安東! – Alex

3

你可以簡單地使用np.concatenate -

np.concatenate(input_list) 

採樣運行 -

In [19]: input_list = [[1,1],[2,2,2]],[[3,3],[4,4],[5,5,5]] 

In [20]: np.concatenate(input_list) 
Out[20]: array([[1, 1], [2, 2, 2], [3, 3], [4, 4], [5, 5, 5]], dtype=object) 
+0

是的,或'np.hstack' –

+0

@AntonProtopopov好'np.hstack','np.vstack'等都在引擎蓋下使用'np.concatenate',所以我猜如果'np.concatenate'馬上工作,所以這一切都很好! :) – Divakar

+1

是的,也是因爲'np.concatenate'比這種情況下的測試性能快了3倍。 –