二维numpy数组的加速迭代

6kkfgxo0  于 2023-03-23  发布在  其他
关注(0)|答案(1)|浏览(140)

我有一个非常大的numpy 2D数组M,我需要从中获取数组中每个元素的所有可能的子矩阵,并将它们放入字典中。
我试过使用ndenumerate和双for循环,但它们都很慢,有可能改进吗?
谢谢。

  • 版本1*
poss = {}
for index, val in numpy.ndenumerate(M):
    poss[index] = [ z for z in filter(lambda t: 2*L <= sub_matrix_dim(index, t) <= H, zip(*numpy.where(M != val))) ]
  • 版本2*
poss = {}
for x in range(R):
    for y in range(C):
        poss[(x,y)] = [ z for z in filter(lambda t: 2*L <= sub_matrix_dim((x,y), t) <= H, zip(*numpy.where(M != M[x][y]))) ]

被调用的函数是:

def sub_matrix_dim(c1: tuple, c2: tuple): return numpy.empty((abs(c2[1] - c1[1]) + 1, abs(c2[0] - c1[0]) + 1), dtype=int).size

编辑例如,从这个2d数组:

[[0 0 0 0 0]
 [0 1 1 1 0]
 [0 0 0 0 0]]

poss{}中有L = 1H = 6,则有:

{
 (0, 0): [(1, 1), (1, 2)],
 (0, 1): [(1, 1), (1, 2), (1, 3)],
 (0, 2): [(1, 1), (1, 2), (1, 3)],
 ...
 (1, 1): [(0, 0), (0, 1), (0, 2), (0, 3), (1, 0), (1, 4), (2, 0), (2, 1), (2, 2), (2, 3)],
 ...
 (2, 1): [(1, 1), (1, 2), (1, 3)], 
 (2, 2): [(1, 1), (1, 2), (1, 3)], 
 (2, 3): [(1, 1), (1, 2), (1, 3)], 
 (2, 4): [(1, 2), (1, 3)]
}
nkkqxpd9

nkkqxpd91#

我可能走错方向了,但这不管用吗?

def sub_matrix_dim(c1: tuple, c2: tuple): return (abs(c2[1] - c1[1]) + 1)) * (abs(c2[0] - c1[0]) + 1)

相关问题