本文最后更新于:星期二, 八月 2日 2022, 9:32 晚上
本文将介绍np.delete中的参数及使用方法
Python中列表元素删除
在列表中删除元素,我们可以:
list_a = [1,2,3,4,5]
list_a.pop(-1)
print(list_a) # [1,2,3,4]
del list_a[0]
print(list_a) # [2,3,4]
del list[1:]
print(list_a) # [2]
在numpy的ndarray中删除元素
numpy中的数组ndarray是定长数组,对ndarray的处理不像对python中列表的处理那么方便。想要删除ndarray中的元素,我们往往只能退而求其次,返回一个没有对应元素的副本。在numpy中我们一般使用delete函数。此外,numpy的delete是可以删除数组的整行和整列的。
简单介绍一下np.delete
:
numpy.delete(arr, obj, axis=None)
- arr:输入数组
- obj:切片,整数,表示哪个子数组要被移除
- axis:删除子数组的轴
- 返回:一个新的子数组
下面是使用举例:
A = np.arange(15).reshape((3,5))
print(A)
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
B = np.delete(A, 1) # 先把A给ravel成一维数组,再删除第1个元素。
C = np.delete(A, 1, axis=0) # axis=0代表按行操作
D = np.delete(A, 1, axis=1) # axis=1代表按列操作
print(A) # 并没有改变,delete不会操作原数组。
[[ 0 1 2 3 4]
[ 5 6 7 8 9]
[10 11 12 13 14]]
print(B) # 先把A给ravel成一维数组,再删除第1个元素。
[ 0 2 3 4 5 6 7 8 9 10 11 12 13 14]
print(C) # axis=0代表按行操作
[[ 0 1 2 3 4]
[10 11 12 13 14]]
print(D) # axis=1代表按列操作
[[ 0 2 3 4]
[ 5 7 8 9]
[10 12 13 14]]
不了解axis的读者可以看我写的这篇文章。
在np.delete的index参数中应用切片操作
index参数必须是个由整数元素组成的列表,内部存放着的整数代表着目标array的下标。
当我想实现删除从第5个到第100个之间的所有元素时,不能使用slice,这就比较尴尬了。
In [5]: np.delete(x, [3:6])
File "<ipython-input-215-0a5bf5cc05ba>", line 1
np.delete(x, [3:6])
^
SyntaxError: invalid syntax
我们没办法在函数参数部分让其接受slice。怎么解决呢?我们可以把参数从[start:end]
换成A[start:end]
吗?
A = np.arange(10)*2
print(A)
[ 0 2 4 6 8 10 12 14 16 18]
B = np.delete(A, A[1:4]) # 搞错了吧!预期结果:0 8 10 12 14 16 18
print(B)
[ 0 2 6 10 14 16 18]
我们这段代码能够执行,但是不是我们想要的结果。什么原因呢?是因为np.delete的index参数接受的是下标数组,而A[1:4]=[2,4,6],那么np.delete就忠实地执行了删除第2、4、6个元素的任务。但我们的本意只是想删除下标从1到4的元素而已。
D = np.delete(A, [1,2,3])
print(D) # [ 0 8 10 12 14 16 18]
要想使用slice,可以采用下列方式:1. slice
函数或者range
函数;2. np.s_
C = np.delete(A, slice(1,4))
print(C) # [ 0 8 10 12 14 16 18]
E = np.delete(A, np.s_[1:4])
print(E) # [ 0 8 10 12 14 16 18]
其实np.s_[1:4]
只不过是很方便产生slice(1,4)的一种方式而已。
其他实用的方法
除此之外,我们还可以采用mask的方式选择原数组中的元素组成新数组
mask = np.ones((len(A),), dtype=bool)
mask[[1,2,3]] = False
print(A[mask]) # [ 0 8 10 12 14 16 18]
或者干脆采用数组拼合的方式
G = np.empty(len(A)-len(A[1:4]), dtype=int)
G[0:1] = A[0:1]
G[1:len(G)] = A[4:]
print(G) # [ 0 8 10 12 14 16 18]
后两种方法不像我们想象的那么没用,反而很常见,尤其是mask方法。
本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!