首页 > 解决方案 > 从列表中的滑动窗口中选择随机项目

问题描述

my_array我有一个包含整数项的数组。我想循环my_array x次(例如x = 5),所以my_array应该切成x块。

在第一次迭代中,我想从第一个块中抽取 10% 的随机项,my_array在第二次迭代中,我想从第二个块中抽取 10% 的随机项,my_array依此类推。

我试过了

import random
percentage = 0.1
my_array = [3,6,9,8,7,1,2,4,5,19,10,11,12,13,14,15,16,17,18,20]
random.sample(range(len(my_array)), int(max(1,percentage * len(my_array))))

我可以从整个my_array. 如何制作块并从相关块中选择项目?即使对于可变长度的my_array.

标签: python

解决方案


您可以使用它numpy来有效地执行此操作。

如果块需要从my_array滚动窗口)以相同的顺序获取数据:

用于numpy.array_split创建块。然后使用列表推导,从每个块中随机选择 10% 的项目:

import numpy as np
chunks = np.array_split(my_array, 5)
selected_items = [random.sample(list(chunk), int(max(1, percentage * len(chunk)))) for chunk in chunks]
输出:
>>> selected_items
[[6], [1], [11], [13], [20]]

如果块需要以随机顺序从以下位置获取数据my_array

numpy.array_split一起使用numpy.random.permutation

import numpy as np
chunks = np.array_split(np.random.permutation(my_array), 5)
selected_items = [random.sample(list(chunk), int(max(1, percentage * len(chunk)))) for chunk in chunks]
输出:
>>> selected_items
[[9], [12], [20], [4], [19]]


要在每次迭代中获取选定项目的列表,请计算块,循环它们并从每个块中选择 10% 的项目:

import numpy as np
chunks = np.array_split(my_array, 5)
for i, chunk in enumerate(chunks):
    selected_items = random.sample(list(chunk), int(max(1, percentage * len(chunk))))
    print ("iteration ", i+1, ": ", selected_items)
    # do stuff with selected_items
输出:
iteration  1 :  [3]
iteration  2 :  [1]
iteration  3 :  [10]
iteration  4 :  [15]
iteration  5 :  [17]

推荐阅读