Numpy 获取数组的索引,其中4个或4个以上的相邻元素为1
我想获得数组(数据)的索引,其中4个或4个以上的相邻元素为1:Numpy 获取数组的索引,其中4个或4个以上的相邻元素为1,numpy,scipy,scikit-image,Numpy,Scipy,Scikit Image,我想获得数组(数据)的索引,其中4个或4个以上的相邻元素为1: import numpy as np data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 1 , 0], [0, 1 , 1 , 0 , 0 , 1 , 1 , 0], [1, 1 , 0 , 1 , 1 , 0 , 0 , 0], [0, 0 , 0 , 1 , 1 , 0 , 0 , 0]
import numpy as np
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 1 , 0],
[0, 1 , 1 , 0 , 0 , 1 , 1 , 0],
[1, 1 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 0]])
你会怎么做
预期的答案是:
answer = np.array([[0, 0 , 0 , 0 , 0 , 0 , 0 , 0],
[0, 1 , 1 , 0 , 0 , 0 , 0 , 0],
[1, 1 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 0],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 0],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 0]])
我已将不需要的像素转换为0。这里有一个使用
numpy.ndimage
的解决方案。它计算阵列中相邻区域(of1.0
s)的大小,然后用相应区域的大小替换阵列中的每个像素。然后,可以使用该设置将图像中不属于大小至少为4的区域的所有像素设置为零
import scipy.ndimage.measurements as m
labels,nlabels = label(data)
sizes = np.hstack((0,m.sum(data, labels, range(1,nlabels+1))))
data[sizes[labels] < 4] = 0.0
将scipy.ndimage.measurements导入为m
标签,nlabels=标签(数据)
大小=np.hstack((0,m.sum(数据,标签,范围(1,nlabels+1)))
数据[大小[标签]<4]=0.0
这里有一个使用numpy.ndimage
的解决方案。它计算阵列中相邻区域(of1.0
s)的大小,然后用相应区域的大小替换阵列中的每个像素。然后,可以使用该设置将图像中不属于大小至少为4的区域的所有像素设置为零
import scipy.ndimage.measurements as m
labels,nlabels = label(data)
sizes = np.hstack((0,m.sum(data, labels, range(1,nlabels+1))))
data[sizes[labels] < 4] = 0.0
将scipy.ndimage.measurements导入为m
标签,nlabels=标签(数据)
大小=np.hstack((0,m.sum(数据,标签,范围(1,nlabels+1)))
数据[大小[标签]<4]=0.0
这是略读版。稍长一点,但可能更明确一些:
from __future__ import print_function
import numpy as np
from skimage.measure import label, regionprops
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 1 , 0],
[0, 1 , 1 , 0 , 0 , 1 , 1 , 0],
[1, 1 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 0]])
labels = label(data, background=0, neighbors=4)
regions = regionprops(labels)
out = np.zeros_like(data)
for r in regions:
if r.area >= 4:
rows, cols = r.coords.T
out[rows, cols] = 1
print(out)
这是略读版。稍长一点,但可能更明确一些:
from __future__ import print_function
import numpy as np
from skimage.measure import label, regionprops
data = np.array([[0, 0 , 0 , 0 , 0 , 0 , 1 , 0],
[0, 1 , 1 , 0 , 0 , 1 , 1 , 0],
[1, 1 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 0],
[0, 0 , 0 , 1 , 1 , 0 , 0 , 1],
[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
[1, 1 , 0 , 0 , 0 , 0 , 0 , 0]])
labels = label(data, background=0, neighbors=4)
regions = regionprops(labels)
out = np.zeros_like(data)
for r in regions:
if r.area >= 4:
rows, cols = r.coords.T
out[rows, cols] = 1
print(out)
您的示例的预期输出是什么?邻接可以是任何方向,例如垂直、对角线、T形吗?是的,它们可以是任何方向。我编辑了我的问题以显示预期的答案。您的示例的预期输出是什么?邻接可以在任何方向上,例如垂直、对角、T形吗?是的,它们可以在任何方向上。我已经编辑了我的问题,以显示预期的答案。此外,最好避免for循环是不?不确定如何避免此处的for循环。并且4个相邻的元素可以是任何形状。另外,最好避免for循环不是吗?不确定如何避免这里的for循环。“四个相邻的元素可以是任意形状的。@西门,最后一个问题已经回答了。@OliverW。”。我知道你提供的链接,因为他们已经被SF链接到这个问题。然而,我正在寻找使用numpy ans scipy解决问题的方法,主要是scipy过滤器等等。@simen,最后一个问题得到了回答。@OliverW。我知道你提供的链接,因为他们已经被SF链接到这个问题。但是,我希望使用numpy和scipy解决这个问题,主要是scipy过滤器等等。