我有一个mxn矩阵A,其中m%t = n%t = 0,因此较小的txt矩阵B平铺矩阵而没有边框或重叠.我想检查A是否完全由B的瓦片组成,而不是尽可能有效地计算作为中间步骤的瓦片.此外,对于我的特殊用例,没有必要知道B.测试A是否在每个方向上严格重复每个txt瓦片就足够了.
数字示例:
@H_502_8@A = [[1,1,0],[0,1],[1,1]] B.shape = [2,2] --> True B.shape = [1,1] --> False
到目前为止,我计算了一个比较矩阵C,它只是B的平铺,以适应A的大小:
@H_502_8@import numpy as np x,y = B.shape x_a,y_a = A.shape x_t = x_a/x y_t = y_a/y B_dash = A[:x,:y] C = np.tile(B_dash,(x_t,y_t)) np.count_nonzero(A-C)
有没有更快的方法,不计算C?
最佳答案
Appproach#1:似乎我们将A中B的出现次数计算为不同的块.所以,我们可以使用
原文链接:https://www.f2er.com/python/438699.htmlskimage.util.view_as_blocks
–
@H_502_8@from skimage.util import view_as_blocks as viewW out = np.count_nonzero((viewW(A,B.shape) == B).all((2,3)))
Appproach#2:与NumPy保持联系,我们会 –
@H_502_8@m1,n1 = A.shape m2,n2 = B.shape out = np.count_nonzero((A.reshape(m1//m2,m2,n1//n2,n2) == B[:,None]).all((1,3)))
样品运行 –
@H_502_8@In [274]: A Out[274]: array([[2,2,[5,3,5,[3,6],1]]) In [275]: B Out[275]: array([[3,3],0]]) In [276]: np.count_nonzero((viewW(A,3))) Out[276]: 1 In [278]: A Out[278]: array([[2,1]]) In [279]: B Out[279]: array([[3,0]]) In [280]: np.count_nonzero((viewW(A,3))) Out[280]: 2