添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

摘要: array 从NumPy的 index ,最直接的方法是调用函数 np.delete(array, index) ,该函数返回一个已删除元素的新数组。

问题: 给定一个Numpy数组;如何从Numpy数组中删除特定元素?

例子。 考虑下面这个Numpy数组,如下图所示。

import numpy as np
arr = np.array([10, 20, 30, 40, 50])

挑战: 你将如何从上述数组中删除元素2040?

预期的输出。

[10 30 50]

方法1:使用numpy.delete()

前提是。

numpy.delete() 是Numpy库中的一个方法,它可以根据给定的索引/位置从一个numpy数组中删除元素。
语法。 numpy.delete(arr, obj, axis=None)

  • arr表示要删除的元素所在的numpy数组。
  • obj 表示要从numpy数组中删除的元素的索引/位置或索引列表。
  • axis 代表你要删除的元素的轴,即,
  • axis = 1 表示删除列中的元素。
  • axis = 0 表示删除整个行的元素。
  • 如果axis = None ,那么在应用delete之前,将给定的数组平铺。
  • 在删除指定的索引/索引处的元素后,它返回一个传递的numpy数组的副本。

    ⦿使用索引删除数组元素

    办法是。 使用numpy.array(arr,obj) 函数,使obj代表一个索引列表,其中的元素必须被删除。

    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    delete_indices = [1, 3]
    new_arr = np.delete(arr, delete_indices)
    print(new_arr)
    
    [10 30 50]
    

    ⦿Delete Array Elements Directly

    np.where() 是Numpy库的一个函数,它允许你根据一个特定的条件从一个给定的Numpy数组中选择某些元素。

    调用numpy.where(condition) 函数来创建一个布尔掩码。你可以在&(and), |(or)等操作符的帮助下提供多个条件。在我们的例子中,选择要删除的两个元素的条件将是:np.where((arr == 20) | (arr == 40))

    一旦元素被选中,调用numpy.delete(arr, obj) 方法,这样obj 代表基于指定条件的索引处的元素。

    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    new_arr = np.delete(arr, np.where((arr == 20) | (arr == 40)))
    print(new_arr)
    
    [10 30 50]
    

    方法2:使用numpy.setdiff1d

    前提是。

    numpy.setdiff1d(arr1, arr2, assume_unique=False) 是Numpy库中的一个函数,可以找到两个数组之间的差值,并返回两个数组中的唯一值。

  • arr1arr2代表输入数组。
  • assume_unique : bool
  • 当这个参数是True ,那么输入的两个数组都被认为是唯一的,这就加快了计算速度。默认情况下,它是False
  • 创建一个Numpy数组,存储要从给定数组中移除的元素。
  • 调用np.setdiff1d(arr, arr_) ,使arr代表给定的数组,而arr_代表存储要删除的元素的数组。这将返回一个包含两个数组中都不存在的元素的数组。换句话说,要删除的元素将从原数组中删除。
  • import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    arr_ = np.array([20, 40])
    new_arr = np.setdiff1d(arr, arr_)
    print(new_arr)
    
    [10 30 50]
    

    注意。 setdiff1d 将产生一个排序的输出。

    方法3:使用~np.isin

    numpy.isin(target_array, list) 方法通过比较一个数组和另一个有不同大小元素的数组,返回一个布尔数组。

    import numpy as np
    arr_1 = np.array([10, 20, 30, 40, 50])
    arr_2 = np.array([10, 30, 50])
    res = np.isin(arr_1, arr_2)
    print(res)
    # OUTPUT: [ True False  True False  True]
    

    ⦿Delete by Elements

  • 创建一个包含要删除的元素的数组。
  • 对给定的数组和包含要删除的元素的数组调用~np.isin(arr, arr_) 。通过检查传递的两个数组中的值,否定并创建一个布尔掩码。
  • 通过将上面生成的布尔掩码作为arr[~np.isin(arr, arr_)] ,返回结果数组。这里,arr代表给定数组,布尔掩码帮助我们收集元素的True 值。
  • import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    arr_ = np.array([20, 40])
    new_arr = arr[~np.isin(arr, arr_)]
    print(new_arr)
    # OUTPUT --> [10 30 50]
    

    ⦿Delete by Indices

    在我们深入解释之前,让我们先看一下这段代码。

    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    indices_to_remove = [1, 3]
    new_arr = arr[~np.isin(np.arange(arr.size), indices_to_remove)]
    print(new_arr)
    # OUTPUT --> [10 30 50]
    

    解释。为 了理解上述方法背后的工作原理,让我们看一下程序的步骤分解。

  • arr➜ [10, 20, 30, 40, 50]。
  • indices_to_remove➜ [1, 3] 。
  • 现在让我们深入了解以下这行代码背后的工作原理。arr[~np.isin(np.arange(arr.size), indices_to_remove)].为了理解这一点,让我们把它分解,找出这行代码中使用的每个函数所返回的输出。

  • arr.size 返回5
  • np.arange(arr.size) 返回 [0,1,2,3,4] 。
  • 因此,我们有一个看起来像这样的函数。arr[~np.isin([0,1,2,3,4], [1,3])]
  • 这进一步评估为。arr[~([ False True False True False])]
  • 经过否定。arr[True False True False True]
  • 最后将返回标记为True 的索引处的值,即索引0,1,3的值。因此,输出是[10 30 50]
  • 方法4:使用~np.in1d

    办法。如 果你不知道你要删除的元素的索引,你可以利用Numpy库的in1d函数。

    np.in1d() 函数对两个一维数组进行比较,如果一个数组中的元素也出现在另一个数组中,则返回True 。要删除这些元素,你只需否定这个函数所返回的值。

    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    arr_ = np.array([20, 40])
    new_arr = arr[~np.in1d(arr, arr_)]
    print(new_arr)
    # OUTPUT --> [10 30 50]
    

    方法5:使用列表理解法

    解决这个问题的另一个变通方法是使用一个**列表**理解,如下所示。虽然这可能不是解决我们问题的最pythonic的方法,但它解决了这个问题。因此,我们在本教程中加入了这个解决方案。

    import numpy as np
    arr = np.array([10, 20, 30, 40, 50])
    indices = np.array([1, 3])  # feed the indices to be removed in an array
    new_arr = [val for i, val in enumerate(arr) if all(i != indices)]
    print(new_arr)
    # OUTPUT --> [10, 30, 50]
    

    奖励:在Python中从二维数组中删除一个特定元素

    例1:删除一个行

    import numpy as np
    print("Input Matrix:")
    arr = np.arange(10, 22)
    matrix = arr.reshape(3,4)
    print(matrix)
    print("\nOutput Matrix:")
    # deleting elements from 10 till 13, i.e, row 1.
    new_matrix = np.delete(matrix, 0, axis=0)
    print(new_matrix)
    
    Input Matrix:
    [[10 11 12 13]
     [14 15 16 17]
     [18 19 20 21]]
    Output Matrix:
    [[14 15 16 17]
     [18 19 20 21]]
    

    例2:删除一列

    import numpy as np
    print("Input Matrix:")
    arr = np.arange(10, 22)
    matrix = arr.reshape(3, 4)
    print(matrix)
    print("\nOutput Matrix:")
    # deleting the first column
    new_matrix = np.delete(matrix, 0, axis=1)
    print(new_matrix)
    
    Input Matrix:
    [[10 11 12 13]
     [14 15 16 17]
     [18 19 20 21]]
    Output Matrix:
    [[11 12 13]
     [15 16 17]
     [19 20 21]]
    复制代码
    分类:
    代码人生
    标签: