从长度n的序列中选择m个等距元素

2024-06-08 19:53:25 发布

您现在位置:Python中文网/ 问答频道 /正文

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

这些选择必须是公平的/确定的——每一小节中都有同样多的选择。

当m=10,n=20时,很简单:只需取下第二个元素。 但一般情况下怎么办呢?我需要计算液晶显示器吗?


Tags: 元素公平情况数组显示器向量小节液晶
3条回答

你可能需要Bresenham's line algorithm。从n均匀地选择m元素相当于在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]

下面是一个简单的例子:

from math import ceil

def takespread(sequence, num):
    length = float(len(sequence))
    for i in range(num):
        yield sequence[int(ceil(i * length / num))]

使用math.ceil是因为如果没有它,所选索引将在每个隐式分段的开头加权过多,从而导致整个列表。

使用循环(int i=0;i<;m;i++)

然后获取所需的索引,Ceil(i*m/n)。

相关问题 更多 >