有什么思路实现均匀取值,或者什么包可以做这事

279 天前
 NoOneNoBody
给出有序整数列,不连续,不重复,但部分片段会连续
从这个序列抽取 n 个,要求尽可能分散(首尾最大最小值应该包含),相当于尽可能均匀分散于平分的 n 个区间内

gpt3.5 似乎没能理解“分散”的意思
让它找哪个包能实现也没有好的答案

如 1,2,3,5,7,8,9,10 取 4 个
结果应为 1,3,7,10

ps: 好像 1,5,8,10 更佳?
1643 次点击
所在节点    Python
15 条回复
Oldletter
279 天前
那按照您的描述
[1, 5, 8, 10] 是不是也符合您的需要
lsk569937453
279 天前
你需求也没清楚啊:

a.1 2 4 6 8 100 101 200 205 1000
b.1 2 4 6 8 10 12 14 16 1000
c.1 200 400 600 800 1000 20000

上面 a,b,c 三种情况应该输出什么?
winglight2016
279 天前
不是 gpt 不理解“分散”,而是你自己都不知道。

另外,不讲需求就提算法,除非是很成熟的案例,不然也是没法 design 的
error451
279 天前
n =1 中间值
n = 2 首尾
n = 3 首尾 + 中间值
n > 3
去掉首尾, 然后把中间的序列按照 len / (n-2) 分块,每一块取中间值
NoOneNoBody
279 天前
@lsk569937453 #2
原数列本来就密度不均的话,那也是没办法,只能抽取,不能生成
a 应是 1,100,205, 1000
b: 1, 8, 16, 1000
c:1, 600, 1000, 20000

@Oldletter #1
不需要唯一答案,只需要基本满足条件,其实就是减少随机抽样出现“密度过于集中”这种不可控的情况,人为干预一下
yuyue001
279 天前
In [19]: import numpy as np

In [20]: l = [1,2,3,5,7,8,9,10]

In [21]: res = [l[i] for i in np.arange(len(l))[::2]]

In [22]: res[-1] = l[-1]

In [23]: res
Out[23]: [1, 3, 7, 10]

GPT 往往不太擅长处理数学问题。
Oldletter
279 天前
def select_numbers_optimized(seq, n):
# 计算总间隔数:相邻数字之间的差值总和
intervals = [seq[i + 1] - seq[i] for i in range(len(seq) - 1)]
# 计算目标间隔长度:将总间隔数除以(n-1),得到每个子区间的目标间隔长度
target_interval_length = sum(intervals) / (n - 1)
selected, current_interval_length = [seq[0]], 0
for i in range(len(intervals)):
current_interval_length += intervals[i]
# 当累积的间隔长度达到或超过目标间隔长度时,选择当前数字
if current_interval_length >= target_interval_length:
selected.append(seq[i + 1])
current_interval_length = 0
if len(selected) == n - 1: # 如果已选择了 n-1 个数字,则停止循环
break
selected.append(seq[-1]) # 总是包括序列的最后一个数字
return selected

if __name__ == '__main__':
sequence = [1, 2, 3, 5, 7, 8, 9, 10]
n = 4
selected_numbers_optimized = select_numbers_optimized(sequence, n)
print("干预后选出的数字:", selected_numbers_optimized)
NoOneNoBody
279 天前
@yuyue001 #8
我本意是想 gpt 帮我找找哪个包的方法能实现,它阅读的手册肯定比我多很多,我以为 sklearn 有方法已经能完成这个,没想到没有找到
Famio
279 天前
不专业的回答一下,这个和滤波过程有点像,我在做 realsense 深度处理的时候,是这样处理的:
例如取 10 帧画面的值,然后再取平均值,这个平均值和 10 帧中最接近的那个值就是我滤剩的结果。
Puteulanus
279 天前
感觉跟之前看向量数据库的描述有点像,你想要的是不是聚类算法

<amp-youtube data-videoid="W_ZUUDJsUtA" layout="responsive" width="480" height="270"></amp-youtube>
NoOneNoBody
279 天前
@Famio #9
和我的思路很接近,只是这个思路处理密度接近均匀的可行,但我没想好#2 所说那种密度不均的情况,而且这种样本可能性不小
mkroen
279 天前
这个问题在于怎么理解“分散”
1.理解为中位数
①结果可以固定,自带 range 就能实现
②结果需要随机,分段随机就行
2.理解为平均数(分位数)
①根据分位数分成多段,分别进行随机

我理解 OP 的意思是分位数
Puteulanus
279 天前
bugcoder
279 天前
找一下画直方图的时候,找不等的 bin size 的算法
NoOneNoBody
279 天前
@bugcoder #14
刚写完,还真是用了直方图计数,大致原理是这几句
bin_edges = np.linspace(np.min(sequence), np.max(sequence)+.1, n+1)
hints, _ = np.histogram(sequence, bins=bin_edges)
indices = np.cumsum(hints)[:-1]
arr = np.split(sequence, indices)
然后从 arr 逐个按权重提取

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1017594

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX