V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
NoOneNoBody
V2EX  ›  Python

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

  •  
  •   NoOneNoBody · 283 天前 · 1646 次点击
    这是一个创建于 283 天前的主题,其中的信息可能已经有所发展或是发生改变。
    给出有序整数列,不连续,不重复,但部分片段会连续
    从这个序列抽取 n 个,要求尽可能分散(首尾最大最小值应该包含),相当于尽可能均匀分散于平分的 n 个区间内

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

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

    ps: 好像 1,5,8,10 更佳?
    15 条回复    2024-02-22 23:57:16 +08:00
    Oldletter
        1
    Oldletter  
       283 天前   ❤️ 1
    那按照您的描述
    [1, 5, 8, 10] 是不是也符合您的需要
    lsk569937453
        2
    lsk569937453  
       283 天前   ❤️ 1
    你需求也没清楚啊:

    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
        3
    winglight2016  
       283 天前   ❤️ 1
    不是 gpt 不理解“分散”,而是你自己都不知道。

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

    @Oldletter #1
    不需要唯一答案,只需要基本满足条件,其实就是减少随机抽样出现“密度过于集中”这种不可控的情况,人为干预一下
    yuyue001
        6
    yuyue001  
       283 天前   ❤️ 1
    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
        7
    Oldletter  
       283 天前   ❤️ 1
    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
        8
    NoOneNoBody  
    OP
       283 天前
    @yuyue001 #8
    我本意是想 gpt 帮我找找哪个包的方法能实现,它阅读的手册肯定比我多很多,我以为 sklearn 有方法已经能完成这个,没想到没有找到
    Famio
        9
    Famio  
       283 天前   ❤️ 1
    不专业的回答一下,这个和滤波过程有点像,我在做 realsense 深度处理的时候,是这样处理的:
    例如取 10 帧画面的值,然后再取平均值,这个平均值和 10 帧中最接近的那个值就是我滤剩的结果。
    Puteulanus
        10
    Puteulanus  
       283 天前   ❤️ 1
    感觉跟之前看向量数据库的描述有点像,你想要的是不是聚类算法

    NoOneNoBody
        11
    NoOneNoBody  
    OP
       283 天前
    @Famio #9
    和我的思路很接近,只是这个思路处理密度接近均匀的可行,但我没想好#2 所说那种密度不均的情况,而且这种样本可能性不小
    mkroen
        12
    mkroen  
       283 天前   ❤️ 1
    这个问题在于怎么理解“分散”
    1.理解为中位数
    ①结果可以固定,自带 range 就能实现
    ②结果需要随机,分段随机就行
    2.理解为平均数(分位数)
    ①根据分位数分成多段,分别进行随机

    我理解 OP 的意思是分位数
    Puteulanus
        13
    Puteulanus  
       282 天前   ❤️ 1
    bugcoder
        14
    bugcoder  
       282 天前   ❤️ 1
    找一下画直方图的时候,找不等的 bin size 的算法
    NoOneNoBody
        15
    NoOneNoBody  
    OP
       282 天前
    @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 逐个按权重提取
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2599 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 10:32 · PVG 18:32 · LAX 02:32 · JFK 05:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.