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

mac*_*mac 5 python numpy python-2.7

我正在使用 3 维数组(就本示例而言,您可以想象它们代表屏幕 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.]]])
Run Code Online (Sandbox Code Playgroud)

我想要做的是将G 通道已经低于 5 的那些像素的 G 通道设置为任意值。我可以设法隔离我有兴趣使用的像素:

>>> a[np.where(a[:, :, 1] < 5)]
array([[ 7.,  3.,  1.],
       [ 8.,  1.,  1.]])
Run Code Online (Sandbox Code Playgroud)

但我很难理解如何只为 G 通道分配一个新值。我试过:

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

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])
Run Code Online (Sandbox Code Playgroud)

……不过好像没有什么效果。我也试过:

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

       [[ 4.,  6.,  8.],
        [ 9.,  9.,  9.]]])
Run Code Online (Sandbox Code Playgroud)

...(不明白发生了什么)。最后我试过:

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

       [[ 4.,  6.,  8.],
        [ 8.,  1.,  1.]]])
Run Code Online (Sandbox Code Playgroud)

我怀疑我遗漏了一些关于 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
Run Code Online (Sandbox Code Playgroud)

yos*_*bai 5

>>> 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.]]])
Run Code Online (Sandbox Code Playgroud)

a[:,:,1]给你 G 通道,我通过a[:,:,1] < 5使用它作为索引来对它进行子集化。然后将值 9 分配给所选元素。