使用相等的计数生成min和max之间的数字

时间:2016-11-15 11:42:28

标签: python numpy itertools

我有一个最小值和最大值,我想在它们之间生成一个数字列表,这样所有数字都有相同的数。是否有一个numpy函数或任何函数?

示例:GenerateNums(start = 1,stop = 5,nums = 10)

预期产出:[1,1,2,2,3,3,4,4,5,5],即每个数字的计数几乎相等

5 个答案:

答案 0 :(得分:4)

采取"几乎相等" to heart - 最常见和最不常见的数字之间的差异最多为1.无法保证模式中的数字。

def gen_nums(start, stop, nums):
    binsize = (1 + stop - start) * 1.0 / nums
    return map(lambda x: int(start + binsize * x), xrange(nums))

gen_nums(1, 5, 10)
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]

答案 1 :(得分:1)

有一个numpy功能:

In [3]: np.arange(1,6).repeat(2)
Out[3]: array([1, 1, 2, 2, 3, 3, 4, 4, 5, 5])

答案 2 :(得分:0)

对于几乎相同的计数,您可以从均匀分布中进行采样。 numpy.random.randint这样做:

>>> import numpy as np
>>> np.random.randint(low=1, high=6, size=10)
array([4, 5, 5, 4, 5, 5, 2, 1, 4, 2])

要按排序顺序获取这些值:

>>> sorted(np.random.randint(low=1, high=6, size=10))
[1, 1, 1, 2, 3, 3, 3, 3, 5, 5]

这个过程就像滚动骰子一样:)当你抽样多次时,每个值的计数应该变得非常相似:

>>> from collections import Counter
>>> Counter(np.random.randint(low=1, high=6, size=10000))
Counter({1: 1978, 2: 1996, 3: 2034, 4: 1982, 5: 2010})

对于完全相同的计数:

>>> range(1,6) * 2
[1, 2, 3, 4, 5, 1, 2, 3, 4, 5]
>>> sorted(range(1,6) * 2)
[1, 1, 2, 2, 3, 3, 4, 4, 5, 5]

答案 3 :(得分:0)

def GenerateNums(start=1, stop=5, nums=10):
    result = []
    rep = nums/(stop - start + 1 )   
    for i in xraneg(start,stop):
        for j in range(rep):
            result.append(i)

    return result

答案 4 :(得分:0)

def GenerateNums(start=0,stop=0,nums=0,result=[]):
    assert (nums and stop > 0), "ZeroDivisionError"
    # get repeating value
    iter_val =  int(round(nums/stop))
    # go through strt/end and repeat the item on adding
    [[result.append(x) for __ in range(iter_val)] for x in range(start,stop)]   
    return result       
print (GenerateNums(start=0, stop=5, nums=30))

>>> [0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4]