在numpy数组中查找并展平重复的值

时间:2018-07-31 14:33:45

标签: python numpy

我想在np数组中查找重复x次以上的值并将其设置为0。

让我们说这是我的数组:

[255,0,0,255,255,255,0,0,255,255,255,255,255,0,0]

我想将重复超过x次的所有部分设置为0。 假设x = 3,则输出数组为:

[255,0,0,255,255,255,0,0,0,0,0,0,0,0,0]

如果x = 2:

[255,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

当然,我可以遍历索引,对它们进行计数并将其设置为0,但是必须有一种更快,更有效的方法(目的是从图像中删除水平网格)。

2 个答案:

答案 0 :(得分:0)

使用熊猫

s = pd.Series(x)
n = 5
s.groupby((s != s.shift()).cumsum()).apply(lambda z: z if z.size < n else pd.Series([0]*z.size)).values

array([255,   0,   0, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,  0,   0], dtype=int64)

n = 2
array([255,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,  0,   0], dtype=int64)

答案 1 :(得分:0)

您可以使用长度为x+1,跳为1的滚动窗口查看数据来解决此问题。如果此窗口中的所有值都相等,请将它们全部设置为零。使用SciKit图片的view_as_windows()可以轻松完成滚动窗口:

import numpy
import skimage

x = 3
data = numpy.asarray([255,0,0,255,255,255,0,0,255,255,255,255,255,0,0])
data_view = skimage.util.view_as_windows(data, window_shape=(x + 1,))

mask = numpy.all(numpy.isclose(data_view, data_view[..., 0, None]), axis=1)
data_view[mask, :] = 0

data
# array([255,   0,   0, 255, 255, 255,   0,   0,   0,   0,   0,   0,   0,   0,   0])