Python 根据索引中的值重复二维数组索引元组

Python 根据索引中的值重复二维数组索引元组,python,numpy,Python,Numpy,我有一个numpy 2D矩阵,每个单元格可能包含一个整数值。 例如: [[0, 1, 0, 2, 3], [2, 0, 1, 1, 1]] 我想制作一个列表,其中包含每个x,y单元格乘以其值,例如,我想在下面列出上面的矩阵: [(1,0) , (3,0) , (3,0) , (4,0) , (4,0) , (4,0) , (0,1) , (0,1) , (2,1) , (3,1) , (4,1)] 换句话说,[0,1]的值是1,所以这个x,y在列表中追加1次 我写这段代码。但是它真的很慢

我有一个numpy 2D矩阵,每个单元格可能包含一个整数值。 例如:

[[0, 1, 0, 2, 3], 
 [2, 0, 1, 1, 1]]
我想制作一个列表,其中包含每个x,y单元格乘以其值,例如,我想在下面列出上面的矩阵:

[(1,0) , (3,0) , (3,0) , (4,0) , (4,0) , (4,0) , (0,1) , (0,1) , (2,1) , (3,1) , (4,1)]
换句话说,[0,1]的值是1,所以这个x,y在列表中追加1次

我写这段代码。但是它真的很慢。如何使用优化的方法实现这一点

def page_to_std(data):
        h, w = data.shape
        res = []

        for y in range(0, h):
            for x in range(0, w):
                   amount = int(data[y][x])
                   for i in range(0, amount):
                      res.append((x,y))
        
        return res

看起来你好像把两把斧子都混在一起了。假设是这样,您可以使用生成索引元组,并使用根据展平输入数组重复生成的元组数组:

coo = np.fromiter(np.ndindex(a.shape), dtype='i,i')
np.repeat(coo, a.ravel()).tolist()
# [(0, 1), (0, 3), (0, 3), (0, 4), (0, 4), (0, 4), (1, 0), (1, 0), (1, 2), (1, 3), (1, 4)]

看起来你好像把两把斧子都混在一起了。假设是这样,您可以使用生成索引元组,并使用根据展平输入数组重复生成的元组数组:

coo = np.fromiter(np.ndindex(a.shape), dtype='i,i')
np.repeat(coo, a.ravel()).tolist()
# [(0, 1), (0, 3), (0, 3), (0, 4), (0, 4), (0, 4), (1, 0), (1, 0), (1, 2), (1, 3), (1, 4)]