Numpy 如何保留包含所有元素的补丁1

Numpy 如何保留包含所有元素的补丁1,numpy,scipy,scikit-learn,Numpy,Scipy,Scikit Learn,如何保留包含所有元素的补丁1?从您的帖子的更正中,我相信您可能正在寻找一种方法来检测形状(2,2)的子矩阵都是1。未满足该条件的任何地方都应为零,但应优先考虑满足该条件的子矩阵,因为子矩阵可以重叠 在这种情况下,您很可能对该矩阵的交错网格感兴趣,该矩阵的每个2x2子矩阵的中心都有一个网格,只要该子矩阵的4个元素都是1: >>将numpy作为np导入 >>>从sklearn.feature_extraction.image import提取_补丁#类似于numpy的stride_技巧 >>> >

如何保留包含所有元素的补丁1?

从您的帖子的更正中,我相信您可能正在寻找一种方法来检测形状
(2,2)
的子矩阵都是1。未满足该条件的任何地方都应为零,但应优先考虑满足该条件的子矩阵,因为子矩阵可以重叠

在这种情况下,您很可能对该矩阵的交错网格感兴趣,该矩阵的每个2x2子矩阵的中心都有一个网格,只要该子矩阵的4个元素都是1:

>>将numpy作为np导入
>>>从sklearn.feature_extraction.image import提取_补丁#类似于numpy的stride_技巧
>>> 
>>>data=np.array([[1,1,0,0,0,0,1,0],
...                  [1, 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]])
>>> 
>>>#要考虑边界效应,请在右侧和底部添加边界效应
... # 如果要将边界设置为零,请将其修改为'np.zeros'
... data2=np.one((data.shape[0]+1,data.shape[1]+1))
>>>数据2[:-1,:-1]=数据
>>>vert=np.logical_and(数据2[:-1,:],数据2[1:,])
>>>dual=np。逻辑_和(vert[:,:-1],vert[:,1:)#dual现在是data2数组的“dual”图形/交错网格
>>>面片=提取面片(数据2,面片形状=(2,2))#也可以使用numpy stride#技巧
>>>修补程序[dual==0]=0
>>>补片[dual]=1#优先于双正片
>>>数据2[:-1,:-1].aType(np.uint8)
数组([[1,1,0,0,0,0,0,0,0],
[1, 1, 0, 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]],dtype=uint8)
为了完整性,这种交错网格形式的矩阵也可以通过与
np.ones((2,2))
内核的关联轻松获得。然而,这在计算上更为繁重,因为需要做更多的工作(乘法和求和),而不是简单的位操作。上述方法在速度方面优于基于相关性的方法。 上述交错网格
dual
也可以通过以下方式生成:

from sklearn.feature_extraction.image import extract_patches
import numpy as np

data = np.array([[1, 1 , 0 , 0 , 0 , 0 , 1 , 0],
                 [1, 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]])

patches = extract_patches(data, patch_shape=(2, 2))
您将通过以下方式获得最终结果:

patches = extract_patches(data, patch_shape=(2, 2))
dual = patches.all(axis=-1).all(axis=-1)

但是,它与前面的方法的不同之处在于边界处发生的情况。

这里有一种替代方法,使用和来自。(问题中的描述仍然太模糊——无论如何,对我来说——因此这是基于@OliverW.的答案中显示的结果。)


快速提问:将补丁保留在这里是什么意思?您的预期输出是什么?修补程序阵列已将数据阵列拆分为2×2个修补程序。如果所有元素都是1,我想保留这些补丁,否则将所有元素转换为0。“否则将所有元素转换为1。”你是说0,对吗?否则,您将得到一个满是1的数组。@OliverW。我的意思是一个子数组或数组补丁中的所有元素。不,我没有。到目前为止,我已经看到对您的问题进行了5次编辑,我想知道您是如何从该数据集获得输出的。我建议您基于当前数组
数据
再次尝试(手动)创建所需的数组并将其添加到您的帖子中。@musk现在不确定您想要什么,您链接到的问题已经得到回答。他们有什么不清楚的?如果你觉得这些问题没有得到令人满意的回答,也许你可以考虑用一个输入数据和期望输出数据的好例子来问一个新的问题?@ Mask,我已经编辑了我的答案,也许最后一个选择就是你的意思。谢谢你让它更容易理解。谢谢,恭喜!我可以知道为什么应该使用origin=(-1,-1)吗?
dual = patches.all(axis=-1).all(axis=-1)
patches[dual==False] = 0
patches[dual] = 1
In [138]: from scipy.ndimage import minimum_filter, maximum_filter

In [139]: data
Out[139]: 
array([[1, 1, 0, 0, 0, 0, 1, 0],
       [1, 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]])

In [140]: m = minimum_filter(data, size=(2,2), mode='constant', origin=(-1,-1))

In [141]: result = maximum_filter(m, size=(2,2), mode='constant')

In [142]: result
Out[142]: 
array([[1, 1, 0, 0, 0, 0, 0, 0],
       [1, 1, 0, 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]])