【问题标题】:Numpy: how to assign values to individual elements of multidimensional arrays?Numpy:如何为多维数组的单个元素赋值?
【发布时间】:2011-11-05 18:34:18
【问题描述】:

我正在使用 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.]]])

我想做的是为那些 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

【问题讨论】:

    标签: python numpy python-2.7


    【解决方案1】:
    >>> 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] &lt; 5 使用它作为索引。然后将值 9 分配给该选定元素。

    【讨论】:

      【解决方案2】:

      无需使用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.]]])
      

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

      【讨论】:

      • 谢谢安德里亚,但结果不是我想要的。我只想更改“G”通道(值中的第二个元素)。我将编辑我的问题以澄清这一点。
      猜你喜欢
      • 2017-06-07
      • 1970-01-01
      • 1970-01-01
      • 2021-10-08
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多