Numpy 2D数组中的元素删除

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]])
Python

删除运行

要删除数组中的运行,我们可以使用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]]
Python

运行以下代码,我们可以看到删除运行后的数组:

new_arr = remove_runs(arr)
print(new_arr)
Python
array([[0, 2],
       [0, 2],
       [3, 4],
       [3, 4]])
Python

我们可以看到,原始数组中的两个运行都被成功删除了。

总结

在本文中,我们介绍了如何使用numpy来删除2D数组中的运行。我们实现了一个名为remove_runs()的函数,该函数使用了np.diff()np.delete()函数。我们的实现可以轻松地处理任何形状的2D数组,并可以在不修改原数组的情况下删除运行。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册