假设我有一些包含很多值的数组/列表,这意味着将其中的几个加载到内存中最终会由于内存不足而导致内存错误。避免这种情况的一种方法是将这些数组/列表加载到生成器中,然后在需要时使用它们。但是,对于生成器,你没有像数组/列表那么多的控制 - 这就是我的问题。
让我解释。
作为一个例子,我有以下代码,它产生一个带有一些小列表的生成器。所以是的,这根本不是内存密集型的,只是一个例子:
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]
我该怎么做呢?
在出现任何问题之前我为什么要这样做,原因是在我的实际情况下,将数组放入生成器需要一些时间。然后我原则上可以生成一个新的生成器,我按照新列表中的列表顺序排列,但是,这意味着我将不得不等待将它们放入新的生成器中。如果这种情况发生了数千次(如引导所示),那么这需要一些时间。使用第一个生成器,我有所有可用的列表。现在我只是希望有选择地使用它们,所以每次我想要混合它时都不需要创建一个新的生成器,并总结一组新的数组/列表。
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]