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