【问题标题】:filter a N-D numpy array and keep only specific elements过滤 N-D numpy 数组并仅保留特定元素
【发布时间】:2020-11-28 16:46:27
【问题描述】:

我正在处理一个大型 N-D numpy 数组。我想只保留那些存在于不同 numpy 数组中的元素,并将剩余的值设置为 0。

例如,如果我们考虑这个 numpy 数组

array([[[36,  1, 72],
        [76, 50, 23],
        [28, 68, 17],
        [84, 75, 69]],

       [[ 5, 15, 93],
        [92, 92, 88],
        [11, 54, 21],
        [87, 76, 81]]])

我想在所有地方设置0,除了值是501172

【问题讨论】:

  • 到目前为止你有什么尝试?
  • @MadPhysicist,我采用了迭代列表并将替换值设置为零的简单方法,我确信这不是最好的方法
  • 这里没有列表。术语很重要,提供您的工作示例也很重要。

标签: python arrays numpy


【解决方案1】:

如果您只使用numpy,也可以通过将vals 数组强制转换为仅比a 高一级的广播来完成此操作。这是在不使用迭代或其他功能的情况下完成的。

import numpy as np

a = np.array([[[36,  1, 72],
         [76, 50, 23],
         [28, 68, 17],
         [84, 75, 69]],
 
        [[ 5, 15, 93],
         [92, 92, 88],
         [11, 54, 21],
         [87, 76, 81]]])

vals = np.array([50, 11, 72])
inds = a == vals[:, None, None, None]
a[~np.any(inds, axis = 0)] = 0
a

输出:

array([[[ 0,  0, 72],
        [ 0, 50,  0],
        [ 0,  0,  0],
        [ 0,  0,  0]],

       [[ 0,  0,  0],
        [ 0,  0,  0],
        [11,  0,  0],
        [ 0,  0,  0]]])

【讨论】:

    【解决方案2】:

    我通过将reducenp.logical_or 组合来设置掩码并迭代应保留的值:

    import functools
    import numpy as np
    
    arr = np.array([[[36,  1, 72],
            [76, 50, 23],
            [28, 68, 17],
            [84, 75, 69]],
           [[ 5, 15, 93],
            [92, 92, 88],
            [11, 54, 21],
            [87, 76, 81]]])
    
    # Set the values that should not
    # be set to zero
    vals = [11, 50, 72]
    
    # Create a mask by looping over the above values
    mask = functools.reduce(np.logical_or, (arr==val for val in vals))
    
    masked = np.where(mask, arr, 0.)
    
    print(masked)
    > array([[[ 0.,  0., 72.],
            [ 0., 50.,  0.],
            [ 0.,  0.,  0.],
            [ 0.,  0.,  0.]],
    
           [[ 0.,  0.,  0.],
            [ 0.,  0.,  0.],
            [11.,  0.,  0.],
            [ 0.,  0.,  0.]]])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-07
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多