代码之家  ›  专栏  ›  技术社区  ›  Denver Dang

有选择地使用生成器项

  •  0
  • Denver Dang  · 技术社区  · 7 年前

    假设我有一些数组/列表包含很多值,这意味着将其中的几个加载到内存中最终会导致内存不足导致内存错误。避免这种情况的一种方法是将这些数组/列表加载到生成器中,然后在需要时使用它们。但是,对于生成器,您没有数组/列表那么多的控制权,这就是我的问题。

    让我解释一下。

    import numpy as np
    
    np.random.seed(10)
    
    number_of_lists = range(0, 5)
    
    generator_list = (np.random.randint(0, 10, 10) for i in number_of_lists)
    

    如果我迭代这个列表,我会得到以下结果:

    for i in generator_list:
        print(i)
    
    >> [9 4 0 1 9 0 1 8 9 0]
    >> [8 6 4 3 0 4 6 8 1 8]
    >> [4 1 3 6 5 3 9 6 9 1]
    >> [9 4 2 6 7 8 8 9 2 0]
    >> [6 7 8 1 7 1 4 0 8 5]
    

    我要做的是对所有列表按元素求和( axis = 0

    [36, 22, 17, 17, 28, 16, 28, 31, 29, 14]
    

    为此,我可以使用以下方法:

    sum = [0]*10
    for i in generator_list:
        sum += i
    

    哪里 10

    generator_list 我想用。举个例子,如果我想把第一个中的两个求和呢 [0] 列表,第三个列表中的一个,最后一个列表中的两个,即:

    [9 4 0 1 9 0 1 8 9 0]
    [9 4 0 1 9 0 1 8 9 0]
    [4 1 3 6 5 3 9 6 9 1]
    [6 7 8 1 7 1 4 0 8 5]
    [6 7 8 1 7 1 4 0 8 5]
    
    >> [34, 23, 19, 10, 35, 5, 19, 22, 43, 11]
    

    在任何问题出现之前,我为什么要这样做,原因是在我的实际案例中,将数组放入生成器需要一些时间。原则上,我可以生成一个新的生成器,按照列表的顺序排列,就像在新的生成器中看到的那样,但是同样,这意味着我必须等待它们进入新的生成器。如果这种情况发生上千次(就像引导一样),那就需要一些时间。对于第一个生成器,我有所有可用的列表。现在我只希望有选择性地使用它们,这样我就不必每次都要创建一个新的生成器,并对一组新的数组/列表求和。

    1 回复  |  直到 7 年前
        1
  •  1
  •   rocksportrocker    7 年前
    import numpy as np
    np.random.seed(10)
    
    number_of_lists = range(5)
    
    generator_list = (np.random.randint(0, 10, 10) for i in number_of_lists)
    
    indices = [0, 0, 2, 4, 4]
    assert sorted(indices) == indices, "only works for sorted list"
    
    # sum_ = [0] * 10
    
    # I prefer this:
    sum_ = np.zeros((10,), dtype=int)
    
    generator_index = -1
    
    for index in indices:
        while generator_index < index:
            vector = next(generator_list)
            generator_index += 1
        sum_ += vector
    
    print(sum_)
    

    [34 23 19 10 37  5 19 22 43 11]