Numpy:如何为多维数组的各个元素赋值?

时间:2011-11-05 18:34:19

标签: python numpy python-2.7

我正在使用三维数组(出于本示例的目的,您可以想象它们代表屏幕X,Y坐标处的RGB值。)

>>> 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

2 个答案:

答案 0 :(得分: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 :(得分: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.]]])

你没有在你的问题中列出预期的输出,所以我不确定这是你想要的。