2024-06-08 19:53:25 发布
网友
我有一个n个元素的向量/数组。我想选择m个元素。
这些选择必须是公平的/确定的——每一小节中都有同样多的选择。
当m=10,n=20时,很简单:只需取下第二个元素。 但一般情况下怎么办呢?我需要计算液晶显示器吗?
你可能需要Bresenham's line algorithm。从n均匀地选择m元素相当于在mx n离散像素网格中画一条线。假设x坐标在0..n-1和y坐标0..m-1中,并像在(0,0)和(n-1,m-1)之间画一条线一样继续。每当y坐标发生变化时,从索引x中选择一个元素。
n
m
x
0
n-1
y
m-1
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是因为如果没有它,所选索引将在每个隐式分段的开头加权过多,从而导致整个列表。
math.ceil
使用循环(int i=0;i<;m;i++)
然后获取所需的索引,Ceil(i*m/n)。
你可能需要Bresenham's line algorithm。从
n
均匀地选择m
元素相当于在m
xn
离散像素网格中画一条线。假设x
坐标在0
..n-1
和y
坐标0
..m-1
中,并像在(0,0)和(n-1,m-1)之间画一条线一样继续。每当y
坐标发生变化时,从索引x
中选择一个元素。UPD:但是这个简单的函数似乎就足够了:
下面是一个简单的例子:
使用
math.ceil
是因为如果没有它,所选索引将在每个隐式分段的开头加权过多,从而导致整个列表。使用循环(int i=0;i<;m;i++)
然后获取所需的索引,Ceil(i*m/n)。
相关问题 更多 >
编程相关推荐