【问题标题】:Remove numbers from a numpy array从 numpy 数组中删除数字
【发布时间】:2015-09-28 06:40:18
【问题描述】:

假设我有一个 numpy 数字数组(例如:整数)。我想在序列中的任何位置删除数字k。目前我正在为此编写一个 for 循环,这似乎有点过头了。有直接的方法吗?一般来说,如果我要删除一个多一个的数字怎么办。

【问题讨论】:

  • 你不能简单地使用a[a != <some number>] 吗?
  • 是的,我能做到。是否保证订单被保留?
  • 是的,它应该以相同的顺序返回元素。

标签: python arrays numpy vectorization


【解决方案1】:

假设A 是输入数组,B 是包含要删除的数字的数组,您可以使用np.in1dA 中获取B 的匹配掩码,然后使用掩码的反转版本以映射 A 并获得所需的输出。下面是实现的样子 -

A[~np.in1d(A,B).reshape(A.shape)]

示例运行 -

In [14]: A
Out[14]: array([3, 2, 1, 4, 3, 3, 2, 2, 4, 1])
In [15]: B
Out[15]: array([2, 4])

In [16]: A[~np.in1d(A,B).reshape(A.shape)]
Out[16]: array([3, 1, 3, 3, 1])

对于 2D 输入数组的情况,你会得到一个 1D 数组作为输出,就像这样 -

In [21]: A
Out[21]: 
array([[3, 3, 3, 4, 0, 4],
       [2, 4, 4, 4, 4, 3],
       [1, 2, 4, 4, 3, 1],
       [0, 3, 1, 4, 1, 1]])

In [22]: B
Out[22]: array([2, 4])

In [23]: A[~np.in1d(A,B).reshape(A.shape)]
Out[23]: array([3, 3, 3, 0, 3, 1, 3, 1, 0, 3, 1, 1, 1])

【讨论】:

    【解决方案2】:

    如果您尝试检查单个标量值。在 numpy 中,当您将向量与标量值进行比较时,您会返回一个包含True/False 值的数组,其中每个元素表示标量值与元素的比较结果。示例 -

    In [15]: a = np.random.randint(10,100, (100,))
    
    In [16]: a
    Out[16]:
    array([63, 19, 84, 89, 89, 76, 18, 16, 57, 65, 25, 31, 17, 20, 25, 14, 27,
           70, 79, 87, 82, 59, 50, 86, 20, 42, 81, 58, 32, 23, 68, 12, 19, 98,
           11, 90, 76, 55, 40, 66, 83, 64, 46, 65, 94, 64, 91, 89, 18, 44, 59,
           52, 51, 22, 32, 94, 88, 38, 31, 91, 47, 76, 62, 43, 89, 41, 76, 81,
           50, 53, 76, 97, 49, 91, 39, 81, 52, 94, 21, 77, 94, 96, 28, 57, 38,
           10, 55, 57, 55, 41, 15, 14, 91, 69, 80, 43, 83, 31, 21, 76])
    
    In [17]: a != 15
    Out[17]:
    array([ True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
            True,  True,  True,  True,  True,  True,  True,  True,  True,
           False,  True,  True,  True,  True,  True,  True,  True,  True,  True], dtype=bool)
    

    然后您可以使用此 bool 数组来索引您的原始数组,这将返回索引数组具有 True 的值,这是 Boolean array indexing 的一部分。示例 -

    In [18]: a[a != 15]
    Out[18]:
    array([63, 19, 84, 89, 89, 76, 18, 16, 57, 65, 25, 31, 17, 20, 25, 14, 27,
           70, 79, 87, 82, 59, 50, 86, 20, 42, 81, 58, 32, 23, 68, 12, 19, 98,
           11, 90, 76, 55, 40, 66, 83, 64, 46, 65, 94, 64, 91, 89, 18, 44, 59,
           52, 51, 22, 32, 94, 88, 38, 31, 91, 47, 76, 62, 43, 89, 41, 76, 81,
           50, 53, 76, 97, 49, 91, 39, 81, 52, 94, 21, 77, 94, 96, 28, 57, 38,
           10, 55, 57, 55, 41, 14, 91, 69, 80, 43, 83, 31, 21, 76])
    

    【讨论】:

      猜你喜欢
      • 2021-07-03
      • 1970-01-01
      • 2022-12-15
      • 2018-01-13
      • 2018-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多