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

6 投票
2 回答
12051 浏览
提问于 2025-04-17 05:42

我正在处理三维数组(在这个例子中,你可以想象它们代表屏幕上某个点的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.]]])

我想做的是把那些绿色通道值已经低于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 个回答

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.]]])

你在提问时没有列出你期望的输出,所以我不太确定这是不是你想要的结果。

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.]]])

使用 a[:,:,1] 这个代码可以获取到图像中的绿色通道。接着,我用 a[:,:,1] < 5 这个条件来筛选出绿色通道中小于5的那些元素,然后把这些选中的元素的值都改成了9。

撰写回答