摘要:
array
从NumPy的
index
,最直接的方法是调用函数
np.delete(array, index)
,该函数返回一个已删除元素的新数组。
问题: 给定一个Numpy数组;如何从Numpy数组中删除特定元素?
例子。 考虑下面这个Numpy数组,如下图所示。
import numpy as np
arr = np.array([10, 20, 30, 40, 50])
挑战: 你将如何从上述数组中删除元素20
和40
?
预期的输出。
[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库中的一个函数,可以找到两个数组之间的差值,并返回两个数组中的唯一值。
arr1和arr2代表输入数组。
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]]
复制代码