从长度为n的序列中选择m个均匀间隔的元素

j13*_*13r 8 python algorithm

我有一个n元素的向量/数组.我想选择m个元素.

选择必须公平/确定 - 每个小节同样多.

当m = 10,n = 20时很容易:只需要每隔一个元素.但是在一般情况下如何做呢?我需要计算液晶显示器吗?

ham*_*ene 31

你可能需要Bresenham的线算法.m均匀地选择元素n相当于在mx n离散像素网格中绘制线条.假设x坐标在0.. n-1y坐标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 因为没有它,所选择的索引将在每个隐式子部分的开头加权太多,结果列表作为一个整体.

  • @ j13r以这种方式思考.第一个索引始终为零.指数近似等距.如果你不使用`ceil`,你永远不会得到最后一项.因此,您可以在第一个项目和最后一个项目之前的某个项目之间进行均匀采样.因此,样本中的中间索引小于序列的中间索引. (2认同)