2011-11-05 53 views
3

我正在使用3維數組(對於本示例的目的,您可以想象它們代表屏幕的X,Y座標處的RGB值)。Numpy:如何將值分配給多維數組的單個元素?

>>> import numpy as np 
>>> a = np.floor(10 * np.random.random((2, 2, 3))) 
>>> a 
array([[[ 7., 3., 1.], 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 1., 1.]]]) 

我想這樣做,是爲了設定爲任意的值,其爲G通道已經低於5那些像素G通道。我可以設法隔離我感興趣的像素:

>>> a[np.where(a[:, :, 1] < 5)] 
array([[ 7., 3., 1.], 
     [ 8., 1., 1.]]) 

但我很努力去理解如何爲G通道分配一個新值。我試過:

>>> a[np.where(a[:, :, 1] < 5)][1] = 9 
>>> a 
array([[[ 7., 3., 1.], 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 1., 1.]]]) 

......但它似乎沒有產生任何效果。我也試過:

>>> a[np.where(a[:, :, 1] < 5), 1] = 9 
>>> a 
array([[[ 7., 3., 1.], 
     [ 9., 9., 9.]], 

     [[ 4., 6., 8.], 
     [ 9., 9., 9.]]]) 

...(不明白髮生了什麼)。最後,我想:

>>> a[np.where(a[:, :, 1] < 5)][:, 1] = 9 
>>> a 
array([[[ 7., 3., 1.], 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 1., 1.]]]) 

我懷疑我失去了一些東西在NumPy的是如何工作的基礎(這是我第一次使用這個庫)。我希望在如何實現我想要的方面提供一些幫助,以及解釋我以前的嘗試發生的情況。

非常感謝您的幫助和專業知識!

編輯:我希望得到的結果是:

>>> a 
array([[[ 7., 9., 1.],  # changed the second number here 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 9., 1.]]]) # changed the second number here 

回答

3
>>> import numpy as np 
>>> a = np.array([[[ 7., 3., 1.], 
...   [ 9., 6., 9.]], 
... 
...  [[ 4., 6., 8.], 
...   [ 8., 1., 1.]]]) 
>>> a 
array([[[ 7., 3., 1.], 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 1., 1.]]]) 

>>> a[:,:,1][a[:,:,1] <; 5 ] = 9 
>>> a 
array([[[ 7., 9., 1.], 
     [ 9., 6., 9.]], 

     [[ 4., 6., 8.], 
     [ 8., 9., 1.]]]) 

a[:,:,1]給你G通道,我使用它作爲指數子集它由a[:,:,1] < 5。然後將值9分配給所選元素。

1

沒有必要使用where,您可以直接與指數從比較操作所造成的布爾數組的數組。

a=array([[[ 7., 3., 1.], 
      [ 9., 6., 9.]], 
     [[ 4., 6., 8.], 
      [ 8., 1., 1.]]]) 


>>> a[a[:, :, 1] < 5] 
array([[ 7., 3., 1.], 
     [ 8., 1., 1.]]) 

>>> a[a[:, :, 1] < 5]=9 

>>> a 
array([[[ 9., 9., 9.], 
     [ 9., 6., 9.]], 
     [[ 4., 6., 8.], 
     [ 9., 9., 9.]]]) 

你沒有在你的問題中列出預期的輸出,所以我不確定這是你想要的。

+0

謝謝安德烈,但結果不是我想要的。我只想更改「G」通道(值中的第二個元素)。我將編輯我的問題,澄清這一點。 – mac

相關問題