博客

  • Python数据等比连续抽样算法

    numpy里面自带了几种抽样算法,但都是随机抽样,我这里要做的是等比连续抽样,就是对原始数据从前到后按固定的间隔固定的顺序去抽样数据。
    方法一:
    把列表分成n个子组,从每个子组中再抽取一个数作为样本

    def evenly_divide_list(lst, num_groups):
        """按顺序分隔列表为指定数量的子组
        Args:
            lst (list): 列表
            num_groups (int): 分隔次数
        Returns:
            list: 返回子列表的集合
        """
        quotient, remainder = divmod(len(lst), num_groups)
        group_sizes = [quotient] * num_groups
        for i in range(remainder):
            group_sizes[i] += 1
        groups = []
        i = 0
        for size in group_sizes:
            groups.append(lst[i:i + size])
            i += size
        return groups
    data = [1, 2, 4, 5]
    count = 3
    sample_group = evenly_divide_list(data, count)
    for i in range(len(sample_group)):
            print(sample_group[i][0])
    

    方法二:
    对列表索引分成固定的间隔然后进行进行四舍五入

    def extract_elements(lst, num_elements):
        """按顺序均匀抽样元素
        Args:
            lst (list): 列表
            num_groups (int): 抽样次数
        Returns:
            list: 返回抽样元素的集合
        """
        if num_elements > len(lst):
            return lst
        step = len(lst) / num_elements
        return [lst[round(i * step)] for i in range(num_elements)]
    data = [1, 2, 4, 5]
    count = 3
    sample_group = extract_elements(data, count)
    for i in range(len(sample_group)):
            print(sample_group[i])
    

    第一种方法是把不能整分的元素全部加到最前面几个组中,这样前面的组就比后面的组抽样间隔更大
    第二种方法则是把不能等分的元素按四舍五入法分散在不同的段中,这种方法显然抽样更均匀,而且方法一多了一个数组切分过程,算法复杂度更大,所以推荐用方法二。

    Views: 2

  • 正态分布及Python用法

    方差和标准差都是用来反映样本差异大小的
    方差的计算公式:

    标准差的计算公式:
    标准差就是方差的开平方,求方差的目的就是为了得到标准差,方差是求标准差过程的中间值。数学符号是:σ
    正态分布的计算公式:

    其中只有两个变量,一个是中间值,也就是总体的平均值,样本均数,总值均值,用mean表示,数学符号是μ。另一个值就是方差(这里用方差不用标准差应该只是计算方便),数学符号是

    Python用numpy生成符合正态分布的随机数:
    random.normal(loc=0.0, scale=1.0, size=None)
    loc就是中间值,scale是标准差,szie是数据结构,如果整数就是生成几条数据,如果元组就是就数组的维数

    Views: 27

  • Centos7安装Python12

    centos7自带的gcc和openssl版本过低无法成功编译python3.12,所以需要另外安装gcc11和编译openssl1.11。

    yum install centos-release-scl
    yum install -y devtoolset-11-gcc devtoolset-11-gcc-c++
    scl enable devtoolset-11 bash
    echo /opt/rh/devtoolset-11/root/usr/bin/gcc>>~/.bashrc
    yum install -y wget make cmake gcc bzip2-devel libffi-devel zlib-devel
    yum groupinstall -y "Development Tools"
    wget https://www.openssl.org/source/old/1.1.1/openssl-1.1.1w.tar.gz
    tar -zxf openssl-1.1.1w.tar.gz
    cd openssl-1.1.1w
    ./config --prefix=/usr/local/openssl --openssldir=/usr/local/openssl
    make && make install_sw
    export PATH=/usr/local/openssl/bin:\PATH
    export LD_LIBRARY_PATH=/usr/local/openssl/lib:\$LD_LIBRARY_PATH
    cd ..
    wget https://www.python.org/ftp/python/3.12.3/Python-3.12.3.tgz
    tar -zxf Python-3.12.3.tgz
    cd Python-3.12.3
    ./configure --with-openssl=/usr/local/python3 --enable-shared --enable-optimizations
    CFLAGS=-Wno-coverage-mismatch make
    make install
    export PATH=/usr/local/python3/bin:PATH
    export LD_LIBRARY_PATH=/usr/local/python3/lib:$LD_LIBRARY_PATH
    echo /usr/local/python3/lib/ > /etc/ld.so.conf.d/python.conf
    ldconfig
    

    Views: 14

  • LVM扩容swap分区

    swapoff -a
    lvresize /dev/pve/swap -L 32G
    mkswap /dev/pve/swap
    swapon -a
    

    新建swap分区

    lvcreate ubuntu-vg -L 16G -n swap
    mkswap /dev/ubuntu-vg/swap
    echo "/dev/ubuntu-vg/swap swap swap defaults 0 0" >> /etc/fstab
    swapon -a
    

    Views: 53

  • javascript绘制鼠标轨迹并记录坐标点

    <!doctype html>
    <html lang="zh-cn">
    <head>
        <meta charset="UTF-8">
        <title>鼠标轨迹</title>
        <style>
            .stage {
                width: 100%;
            }
            .title {
                margin: 0;
            }
            .track-monitor {
                background-color: rgb(242, 241, 241);
                padding: 0;
                border: 2px solid grey;
                margin-right: 5px;
            }
    
            .track-coordinate {
                background-color: grey;
                color: white;
                height: 25px;
                line-height: 25px;
                font-size: 12px;
                margin: 5px 0px;
            }
    
            .track-coordinate-list {
                font-size: 12px;
                width: 100%;
                word-break: break-word;
                border: 2px solid grey;
                margin: 5px 0px;
                min-height: 100px;
                padding: 2px 2px;
            }
        </style>
        <script>
            var isDrag = false; //是否拖拽
            var count = 0;
            window.addEventListener('load', function () {
                var pad = document.getElementById('pad');
                var stage = document.getElementById('stage');
                var monitor = document.getElementsByClassName('track-monitor')[0];
                var coordinate = document.getElementsByClassName('track-coordinate')[0];
                var clist = document.getElementsByClassName('track-coordinate-list')[0];
                var clist2 = document.getElementsByClassName('track-coordinate-list')[1];
                var reset = document.getElementsByTagName('button')[0];
                var context = pad.getContext('2d');
                var ctx = context;
                var cset = [];
                var cset2 = [];
                var padHeight = 500;
    
                var fixSize = function () {
                    monitor.width = stage.clientWidth;
                    context.strokeStyle = 'grey';
                    context.lineWidth = 1;
                    context.setLineDash([8, 8]);
                    context.beginPath();
                    for (var i = padHeight / 10; i <= padHeight; i += padHeight / 10) {
                        if (i < padHeight) {
                            ctx.moveTo(0, i)
                            ctx.lineTo(stage.clientWidth, i);
                            ctx.stroke();
                        }
                        ctx.fillStyle = "red";
                        ctx.font = "12px 宋体";
                        ctx.fillText(i + ', ' + i / padHeight * 100 + '%' + ';' + i, 3, i - 2);
                    }
                    for (var i = stage.clientWidth / 10; i < stage.clientWidth-1; i += stage.clientWidth / 10) {
                        ctx.moveTo(i, 0)
                        ctx.lineTo(i, stage.clientHeight);
                        ctx.stroke();
                        ctx.fillStyle = "red";
                        ctx.font = "12px 宋体";
                        ctx.fillText(parseInt(i) + ', ' + parseInt(i / stage.clientWidth * 100) + '%', i - 60, 12);
                    }
                    ctx.fillStyle = "red";
                    ctx.font = "12px 宋体";
                    ctx.fillText(parseInt(i) + ', ' + parseInt(i / stage.clientWidth * 100) + '%', i - 60, 12);
                    context.closePath();
                    context.setLineDash([]);
                    ctx.moveTo(0, 0);
                };
                window.addEventListener('resize', function () { fixSize(); });
    
                pad.addEventListener('mousemove', function (e) {
                    if (isDrag) {
                        count++;
                        // 绘制轨迹
                        context.setLineDash([]);
                        context.strokeStyle = 'black';
                        context.lineTo(e.offsetX, e.offsetY);
                        context.lineWidth = 2;
                        context.stroke();
                        // 打印坐标
                        coordinate.innerHTML = count;
                        cset.push(e.offsetY / padHeight);
                        clist.textContent = cset.join(',');
                        cset2.push(e.offsetX + ':' + e.offsetY );
                        clist2.textContent = cset2.join(',');
                    }
                });
                document.addEventListener('mousedown', function (e) {
                    isDrag = true;
                    context.beginPath();
                })
                document.addEventListener('mouseup', function (e) {
                    isDrag = false;
                    context.closePath();
                })
                reset.addEventListener('click', function () {
                    fixSize();
                    cset = [];
                    cset2 = [];
                    clist.innerHTML = '';
                    clist2.innerHTML = '';
                    coordinate.textContent = '在方块中滑动鼠标';
                    count = 0;
                });
                fixSize();
            });
        </script>
    </head>
    
    <body>
        <div class="stage" id="stage">
            <p class="title">画板</p>
            <canvas id="pad" height="500" class="track-monitor"></canvas>
            <button type="button">清空</button>
            <p class="title">轨迹坐标点数</p>
            <div class="track-coordinate">在方块中滑动鼠标</div>
            <p class="title">Y轴相对于顶部的百分比</p>
            <div class="track-coordinate-list" id="percent"></div>
            <p class="title">轨迹坐标</p>
            <div class="track-coordinate-list" id="coordinate"></div>
        </div>
    </body>
    </html>
    


    Views: 115

  • python显示数字时关闭科学计数法

    默认情况下如果数值非常大或非常小会显示为科学计数法,用f-string可以指定数字的显示格式。
    参考这里的说明:https://docs.python.org/zh-cn/3/library/string.html#formatspec

    f或F类型会用定点数输出数值,不会用科学计数法显示数字。用法如下:

    f'{num:f}’ 根据内容自动确定显示位数
    f'{num:5f}’ 最小总宽度显示为5位,不足部分在左边用空格填充,最大宽度则由内容决定
    f'{num:05f}’ 最小总宽度显示为5位,不足部分在左边用0填充,最大宽度则由内容决定
    f'{num:.2f}’ 小数点后最少显示5位,不足部分在右边用0填充,超出部分四舍五入
    f'{num:5.2f}’ 总宽度最少显示5位,不足部分在左边用空格填充,最大宽度则由内容决定,小数点后最少显示2位,不足部分在右边用0填充,超出部分四舍五入
    f'{num:05.2f}’ 总宽度最少显示5位,不足部分在左边用0填充,最大宽度则由内容决定,小数点后最少显示2位,不足部分在右边用0填充,超出部分四舍五入

    from decimal import Decimal
    
    num = Decimal("8.355")
    print(f'{num:f}')
    print(f'{num:5f}')
    print(f'{num:05f}')
    print(f'{num:.5f}')
    print(f'{num:5.2f}')
    print(f'{num:05.2f}')
    

    输出的结果为:

    8.355
    8.355
    8.355
    8.35500
     8.36
    08.36
    

    注意:
    python的四舍五入采用的是四舍六入五成双,具体可以看这篇文章:
    https://www.cnblogs.com/gxfaxe/p/14970856.html
    f-string的更多用法可以参考这里:
    https://zhuanlan.zhihu.com/p/668918715

    Views: 104

  • python或pyinstaller报”source code string cannot contain null bytes”

    pyinstaller报这个错误是因为python版本太低,不支持某些语法
    python报这个错误可能因为py文件损坏,加密,换行符,字符编码等问题

    Views: 243

  • 解决nextcloud中Photos应用不更新或显示照片问题

    1. 方法1

      php occ files:scan --generate-metadata --all

    2. 方法2

      cd /var/www/nextcloud
      rm -rf data/appdata_ocfklnu4oq6f/preview/
      # 里具体appdata目录可能有差异
      php occ files:scan-app-data
      

      我是用的第1种方法,第2种方法没有试

    Views: 67

  • kylin解决重启后ip地址丢失的问题

    打开控制面板->网络连接
    点击+号新建网络连接


    然后配置IP地址,再把自动生成的连接删掉。
    如果不手动创建连接会每次启动时自动创建一个全新的连接,以前IP配置也就没有了,手动创建连接后不再自动创建新的连接。

    Views: 70