2016-11-27 104 views
1

我目前使用Pillow來訪問圖像的每個像素,並用列表元素替換RGB值。Python numpy數組合並操作

但是我認爲這個方法很慢,我讀了一個更快的方法來使用numpy數組。

我將圖像轉換爲具有形狀(x,y,3)的numpy數組,但我不知道如何將它與我的列表「合併」。例如,我有一個包含20個元素的列表,所以我想將我的數組中的前20個元素替換爲列表中的元素,而不更改數組的形狀。

我的數組是這樣的:

[[[121, 222, 222], [1, 1, 1],...]] 

而且我有一個列表,例如:

[120, 99, 0, 88, 78, 32, 123,...] 

最終陣列應該是這樣的:

[[[120, 99, 0], [88, 78, 32], [123, ..., ...],...]] 

名單短於數組,因此當列表結束時,數組中的元素應保持不變。

我試圖儘可能地解釋,有些事情還不清楚,請讓我知道。

提前致謝。

回答

1

隨着a作爲數組和L作爲列表,你可以簡單地得到陣列的平面視圖與np.ravel()slicing分配從L值到它,就像這樣 - 或者

a.ravel()[:len(L)] = L 

,我們可以使用np.put,這樣會隱含獲得平展視圖,併爲它分配給你,就像這樣 -

np.put(a, range(len(L)), L) 

如果我必須選擇,我會去與T他通過使用slicing來避免需要range

採樣運行 -

In [51]: a 
Out[51]: 
array([[[91, 18, 74], 
     [49, 92, 93], 
     [42, 38, 41], 
     [27, 24, 69]], 

     [[14, 72, 49], 
     [85, 74, 45], 
     [32, 88, 89], 
     [12, 85, 60]]]) 

In [52]: L = [120, 99, 0, 88, 78, 32, 123] 

In [53]: a.ravel()[:len(L)] = L 

In [54]: a 
Out[54]: 
array([[[120, 99, 0], 
     [ 88, 78, 32], 
     [123, 38, 41], 
     [ 27, 24, 69]], 

     [[ 14, 72, 49], 
     [ 85, 74, 45], 
     [ 32, 88, 89], 
     [ 12, 85, 60]]]) 
+0

謝謝,這個作品。但在我的情況下,列表中的元素是通過對數組元素執行按位操作生成的。特別是我有一個包含位的列表,我想更改數組中的每個元素以將列表中的位設置爲LSB。 –

+0

@FrancescoCarzaniga在這個問題上應該提到像這些重要的位。希望你在將來的問題中記住這一點。現在,請編輯具有這些細節的問題,並向我們展示更合適/有代表性的樣本輸入和預期輸出。 – Divakar

+0

是的,你是對的我很抱歉,謝謝你的回答,但我找到了解決我的具體問題。再一次非常感謝你! –

0

一個非常簡單的解決方案是使用列表理解。看看這個:

假設lst是列表

lst = [120, 99, 0, 88, 78, 32, 123, 1, 2] 
np.array([lst[x:x+3] for x in range(0, len(lst), 3)]) 

輸出:

array([[120, 99, 0], 
     [ 88, 78, 32], 
     [123, 1, 2]])