我有一个n元素的向量/数组.我想选择m个元素.
选择必须公平/确定 - 每个小节同样多.
当m = 10,n = 20时很容易:只需要每隔一个元素.但是在一般情况下如何做呢?我需要计算液晶显示器吗?
ham*_*ene 31
你可能需要Bresenham的线算法.m均匀地选择元素n相当于在mx n离散像素网格中绘制线条.假设x坐标在0.. n-1和y坐标0.. m-1,并继续像在(0,0)和(n-1,m-1)之间画一条线.每当y坐标发生变化时,从索引中选择一个元素x.
UPD:但似乎这个简单的功能就足够了你:
>>> f = lambda m, n: [i*n//m + n//(2*m) for i in range(m)]
>>> f(1,20)
[10]
>>> f(2,20)
[5, 15]
>>> f(3,20)
[3, 9, 16]
>>> f(5,20)
[2, 6, 10, 14, 18]
Run Code Online (Sandbox Code Playgroud)
agf*_*agf 14
这是一个简单的例子:
from math import ceil
def takespread(sequence, num):
length = float(len(sequence))
for i in range(num):
yield sequence[int(ceil(i * length / num))]
Run Code Online (Sandbox Code Playgroud)
math.ceil 因为没有它,所选择的索引将在每个隐式子部分的开头加权太多,结果列表作为一个整体.