2011-11-05 63 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

相关问题