Python 过滤二维阵列并从中间位置返回坐标

Python 过滤二维阵列并从中间位置返回坐标,python,numpy,matrix,scipy,scikit-image,Python,Numpy,Matrix,Scipy,Scikit Image,我有一个二维零数组,在(1,6)和(2,7)处有一些正整数: 我想通过自定义内核过滤数组: [[1 0 1] [0 1 0] [0 1 0]] 我想用这个内核过滤数组,当这个内核中的2或3个数乘以一个正整数时,我想让它返回乘以0的那些数的坐标 我从图像分析中知道,用内核对2D数组进行卷积很容易,但不会产生中间结果。在上面的2D数组中,它将返回(1,8)和(3,7) 是否有一些包函数可以让这个过程变得简单和容易,或者我必须自己实现它? 与往常一样,我们非常感谢您提供的所有帮助这是it的一个简

我有一个二维零数组,在(1,6)和(2,7)处有一些正整数:

我想通过自定义内核过滤数组:

[[1 0 1]
 [0 1 0]
 [0 1 0]]
我想用这个内核过滤数组,当这个内核中的2或3个数乘以一个正整数时,我想让它返回乘以0的那些数的坐标

我从图像分析中知道,用内核对2D数组进行卷积很容易,但不会产生中间结果。在上面的2D数组中,它将返回(1,8)和(3,7)

是否有一些包函数可以让这个过程变得简单和容易,或者我必须自己实现它?
与往常一样,我们非常感谢您提供的所有帮助

这是it的一个简单实现。您可以通过修改它来提高性能

这里,
num\u ones
是您要筛选的内核中的较低和较高的位数,指的是当此内核中的2或3个位数乘以正整数时的

更新:关于einsum:

我推荐这篇关于einsum的帖子,以了解:

子矩阵
是一个四维数组
子_矩阵[k,l,:,:]
是从
[k,l]
位置和内核形状开始的
a
的子矩阵。(后来我们将它的所有非零值都更改为1,以达到我们的目的)


m=np.einsum('ij,klij->kl',核,子êu矩阵)
kernel
的二维
i
j
乘以
子êu矩阵的最后二维
i
j
数组(换言之,它按元素将核相乘到子矩阵
子êcode>矩阵[k,l,:,:]
)并将所有元素相加为
m[k,l]
。这被称为
内核
a
的二维卷积

如果我面对这样的事情,我可能会亲自实施;但是现在看看这个问题,感觉一定有什么东西可以帮助你。我认为这是一个好问题的迹象:)非常感谢你,这非常有效!请您解释一下np.einsum函数在给定字符串参数“ij,klig->kl”的情况下是如何工作的好吗?@kynnem不客气。我也会补充更多的解释。如果答案能解决问题,请接受它,这样其他人也会发现它很有用。谢谢。@kynnem我在这篇文章中添加了更多的解释,以及一个链接,可以让你更详细地了解它,以防你感兴趣。谢谢你的进一步解释。我知道我还有很多东西要学,但像你这样的答案和解释会产生巨大的不同
[[1 0 1]
 [0 1 0]
 [0 1 0]]
a = np.array([[0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.],
 [0.,0.,0.,0.,0.,0.,2.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.],
 [0.,0.,0.,0.,0.,0.,0.,2.,0.,0.,0.,0.,0.,0.,0.,0.,0.],
 [0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.,0.]])

kernel = np.array([[1.,0.,1.],\
 [0.,1.,0.],\
 [0.,1.,0.]])

sub_shape = kernel.shape
#throshold of number of kernel ones to have non-zero value
num_ones = [2,3]

#divide the matrix into sub_matrices of kernel size
view_shape = tuple(np.subtract(a.shape, sub_shape) + 1) + sub_shape
strides = a.strides + a.strides
sub_matrices = np.lib.stride_tricks.as_strided(a,view_shape,strides)
#convert non_zero elements to 1 (dummy representation)
sub_matrices[sub_matrices>0.] = 1.

#Do convolution
m = np.einsum('ij,klij->kl',kernel,sub_matrices)

#find sub_matrices that satisfy non-zero elements' condition
filt = np.argwhere(np.logical_and(m>=num_ones[0], m<=num_ones[1]))
#for each sub_matix find the zero elements located in non-zero elements of kernel
output = []
for [i,j] in filt:
  output.append(np.argwhere((sub_matrices[i,j,:,:]==0)*kernel) + [i, j])
output =
[[1 8]
 [3 7]]