有选择地使用生成器项

时间:2018-09-04 20:13:46

标签: python generator

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

让我解释一下。

作为示例,我有以下代码,该代码生成带有一些小列表的生成器。是的,这根本不是占用大量内存,只是一个示例:

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]列表中的两个,第三个列表中的一个和最后两个中的2个相加,即:

[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 个答案:

答案 0 :(得分:1)

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]