使用numpy将数据集拆分为比例子集

时间:2016-07-02 07:44:10

标签: python numpy

我想知道是否有这样的功能:

my_fun(my_list, *arg)
  • 其中arg是列表或比例
  • * arg的每个元素都是0到1之间的浮点值
  • arg元素的总和必须< = 1

例如:

my_list = ['a','b','c','d','f',1, 2, 3, 4, 5]
fun_i_am_looking_for (my_list, 0.4, 0.4, 0.1)
result = [['a', 2, 5, 'd'], ['c', 1, 4, 3], ['f']]

我们可以看到arg的总和为0.9因此my_list中的一个元素未显示在结果中。

我知道有:

numpy.random.permutate(dataframe.index)

但它只是随机化一个集合,而我想得到一个较小的列表,其长度定义为比例或百分比。我不希望这些子列表是偶数。如果这样的功能不存在,我会写自己的,只是寻找现成的解决方案。

2 个答案:

答案 0 :(得分:0)

你可以做点什么:

a = np.arange(100)
b = np.array([0.4, 0.4, 0.1])
for i in range(1, len(b)):
  b[i] += b[i-1]
c = np.split(np.random.permutation(a), (b * len(a) + 0.5).astype(np.int))

答案 1 :(得分:0)

似乎没有现成的解决方案,但这可行:

import numpy as np

def split_by_ratio(arr, *ratios):
    arr = np.random.permutation(arr)
    ind = np.add.accumulate(np.array(ratios) * len(arr)).astype(int)
    return [x.tolist() for x in np.split(arr, ind)][:len(ratios)]

现在:

>>> my_list = ['a','b','c','d','f',1, 2, 3, 4, 5]
>>> split_by_ratio(my_list, 0.4, 0.4, 0.1)
[['f', '5', '3', 'a'], ['d', 'b', 'c', '2'], ['4']]