Numpy 2D数组中的元素删除
在本文中,我们将介绍如何使用Numpy来删除2D数组中的运行(runs)。
阅读更多:Numpy 教程
什么是运行
在一个二维数组中,连续的相同值的序列称为运行。以下是一个2D数组的例子,其中有两个运行(在黄色框中):
import numpy as np
arr = np.array([[0, 0, 1, 1, 1],
[0, 0, 1, 2, 2],
[0, 0, 2, 2, 2],
[3, 3, 3, 4, 4],
[3, 3, 3, 4, 4]])
删除运行
要删除数组中的运行,我们可以使用np.diff()函数来比较相邻的元素,以找到运行的位置。然后,我们可以使用np.delete()函数来删除运行。
以下是一个删除2D数组中运行的函数的实现:
def remove_runs(arr):
# 沿着行方向(diff(axis=1))比较相邻元素
# 参考numpy handbook
runs = np.where(np.diff(arr, axis=1) != 0)
# 把相对于arr索引运行的每一个开头和末尾
# 拼接起来成一个形如`(start, end)`的元组
runs = np.c_[runs[0], runs[1], np.full(len(runs[0]), False)]
runs = np.vstack(([0,0,False], runs, [arr.shape[0], arr.shape[1], False]))
# 遍历runs列表
for i in range(len(runs)-1):
# 把运行中的元素提取出来
start = (runs[i][0], runs[i][1])
end = (runs[i+1][0], runs[i+1][1])
run = arr[start[0]:end[0], start[1]:end[1]]
# 如果运行不全是一个值,就标记为删除
if run.size > 1 and not np.all(run == run[0]):
runs[i][2] = True
# 删除被标记的运行,返回新的数组
mask = np.logical_not(runs[:,2])
return arr[mask[:,:-1]]
运行以下代码,我们可以看到删除运行后的数组:
new_arr = remove_runs(arr)
print(new_arr)
array([[0, 2],
[0, 2],
[3, 4],
[3, 4]])
我们可以看到,原始数组中的两个运行都被成功删除了。
总结
在本文中,我们介绍了如何使用numpy来删除2D数组中的运行。我们实现了一个名为remove_runs()的函数,该函数使用了np.diff()和np.delete()函数。我们的实现可以轻松地处理任何形状的2D数组,并可以在不修改原数组的情况下删除运行。
极客教程