代码之家  ›  专栏  ›  技术社区  ›  konstantin

用python m次复制列表

  •  -1
  • konstantin  · 技术社区  · 6 年前

    我正在尝试将python中的两个不同的图像数据库配对(假设数据库A和数据库B,它们存储在numpy数组列表中)。对于数据库A,我有x个图像(例如6),对于数据库B,我有y个图像(例如78)。数据库A中的每个图像对应于数据库B中的78/6=13个图像,顺序相同。因此,

    A    B
    --------------
    1    [1, 13]
    2    [14, 26]
    3    [27, 39]
    4    [38, 52] 
    5    [51, 65] 
    6    [66, 78] 
    

    我想做的是将数据库A中的每个图像复制13次,以使数据库B中的图像数量相同。问题是这些数量不是固定的(x和y)。因此,

    len1 = len(database_A)
    len2 = len(database_B)
    m = round(len2/len1)
    

    我如何返回一个复制的m倍于数据库列表a的元素(m倍于映像1,然后m倍于映像2等等)。

    有时部门会产生一些模块。我该怎么处理那个模块。有一个例子,我有数据库A6图像,而数据库B68和产生mod=2。在这种情况下,我只需要从两个数据库存储66个图像。

    2 回复  |  直到 5 年前
        1
  •  2
  •   Daniel F    6 年前

    假设图像在 (n, x, y) (n, x, y, RGB) 成形阵列:

    np.repeat(A, B.shape[0] // A.shape[0], axis = 0)
    

    如果你真的想保留列表,我还是建议你在 numpy

    list(np.repeat(np.array(A), len(B) // len(A), axis = 0))
    

    A = [a for a in A for _ in range(len(B) // len(A))]
    if len(B) % lenA > 0:
        B = B[:-(len(B) % len(A))]
    
        2
  •  1
  •   Matt Messersmith    6 年前

    我把这个例子调低了一点,使它有3个图像,并设想每个图像需要复制7次( m==7 ). IIUC,这应该可以:

    import numpy as np
    
    def flatten_list_of_lists(replicate):
        for item in replicate:
            if isinstance(item, list):
                yield from flatten_list_of_lists(item)
            else:
                yield item
    
    A = [np.arange(9).reshape(3,3), np.arange(28).reshape(7,4), np.arange(20).reshape(2,10)]
    m = 7
    replicate = [[x]*7 for x in A]
    result = list(flatten_list_of_lists(replicate))
    print([x.shape for x in result])
    

    [(3, 3), (3, 3), (3, 3), (3, 3), (3, 3), (3, 3), (3, 3), (7, 4), (7, 4), (7, 4), (7, 4), (7, 4), (7, 4), (7, 4), (2, 10), (2, 10), (2, 10), (2, 10), (2, 10), (2, 10), (2, 10)]
    

    result (列表)