Python 在numpy数组中查找并平坦重复值

Python 在numpy数组中查找并平坦重复值,python,numpy,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,但必须有一种更快更有效的方法(目的是从图

我想在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,但必须有一种更快更有效的方法(目的是从图像中删除水平网格)。

使用pandas

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)
s=pd.系列(x)
n=5
s、 groupby((s!=s.shift()).cumsum()).apply(lambda z:z如果z.size
您可以通过使用长度为
x+1
和hopsize
1
的滚动窗口查看数据来解决此问题。如果此窗口中的所有值相等,请将它们全部设置为零。使用SciKit图像的
视图作为窗口()
,可以轻松地滚动窗口:


您是否需要一种比线性运行时和恒定空间需求更快、更有效的方法?因为在索引上循环并计数并设置为零就是这样。图像的形状是6600 X 5100。一个简单的循环需要几秒钟。我需要在一秒钟内完成,我不明白。是否要“零”NxM矩阵中的重复行,或行中的单个元素?你知道那些“水平网格”的间距吗?如果你想要次线性运行(虽然从技术上讲它仍然是线性的),我看到的唯一方法就是只查看每个
x/2
th元素,并且只有当这些元素相同时,才检查它们之间的元素。这是否值得付出努力可能取决于你的
x
。它是否只有0和255?
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])