我有一个最小值和最大值,我想在它们之间生成一个数字列表,这样所有数字都有相同的数。是否有一个numpy函数或任何函数?
示例:GenerateNums(start = 1,stop = 5,nums = 10)
预期产出:[1,1,2,2,3,3,4,4,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]