nsga2多目标优化之核心知识点(快速非支配排序、拥挤距离、精英选择策略)详解(python实现)

2023-11-03


一、多目标优化算法简介

     什么是多目标优化算法,见链接:
十分钟了解完多目标优化算法

1.基本知识

支配:假设小明9岁,50斤,小红8岁,45斤,小明无论是岁数还是体重都比小红大,所以小明支配小红。

互不支配:假设小明7岁,50斤,小红8岁,45斤,小明岁数比小红小,但体重比小红大,所以小明和小红互不支配。

帕累托集:在这个集合中,任意两个解互不支配。 如果有2个目标函数,帕累托集应该分布成一条曲线;如果有3个目标函数,帕累托集应该分布成一个超平面。 常规的2个目标函数,解法是目标加权得到是一个点,一个解;帕累托集,目标函数之间没有加权关系,所以得到是一条曲线。

非支配排序:将一组解分成n个集合:rank1,rank2…rankn,每个集合中所有的解都互不支配,但ranki中的任意解支配rankj中的任意解(i<j).

二、NSGA2算法

1.基本原理

     多目标遗传算法是用来分析和解决多目标优化问题的一种进化算法,其核心就是协调各个目标函数之间的关系,找出使得各个目标函数都尽可能达到比较大的(或者比较小的)函数值的最优解集。在众多目标优化的遗传算法中,NSGA2算法是影响最大和应用范围最广的一种多目标遗传算法。在其出现后,由于它简单有效以及比较明显的优越性,使得该算法已经成为多目标优化问题中的基本算法之一。

     介绍NSGA2,首先来介绍以下NSGA算法。

     NSGA通过基于非支配排序的方法保留了种群中的优良个体,并且利用适应度共享函数保持了群体的多样性,取得了非常良好的效果。但实际工程领域中发现NSGA算法存在明显不足,这主要体现在如下3个方面:

  • (1)非支配排序的高计算复杂性。非支配排序算法一般要进行mN^3次搜索(m是目标函数的数目,体重和年龄可以被视为两个目标函数,N是一组解的大小),搜索的次数随着目标函数数量和种群大小的增加而增多。
  • (2)缺少精英策略。研究结果表明,引用精英策略可以加快遗传算法的执行,并且还助于防止优秀的个体丢失。
  • (3)需要指定共享参数share,在NSGA算法中保持种群和解的多样性方法都是依赖于共享的概念,共享的主要问题之一就是需要人为指定一个共享参数share。

     为了克服非支配排序遗传算法(NSGA)的上述不足,印度科学家Deb于2002年在NSGA算法的基础上进行了改进,提出了带精英策略的非支配排序遗传算法(Elitist Non-Dominated Sorting Genetic Algorithm,NSGA-II),NSGA-II 算法针对NSGA的缺陷通过以下三个方面进行了改进[16]:

  • 提出了快速非支配的排序算法,降低了计算非支配序的复杂度,使得优化算法的复杂度由原来的 降为 ( 为目标函数的个数, 为种群的大小)。
  • 引入了精英策略,扩大了采样空间。将父代种群与其产生的子代种群组合在一起,共同通过竞争来产生下一代种群,这有利于是父代中的优良个体得以保持,保证那些优良的个体在进化过程中不被丢弃,从而提高优化结果的准确度。并且通过对种群所有个体分层存放,使得最佳个体不会丢失,能够迅速提高种群水平。
  • 引入拥挤度和拥挤度比较算子,这不但克服了NSGA算法中需要人为指定共享参数 的缺陷,而且将拥挤度作为种群中个体之间的比较准则,使得准Pareto域中的种群个体能均匀扩展到整个Pareto域,从而保证了种群的多样性。

2.快速非支配排序

     解的支配关系与Pareto最优解



     快速非支配排序步骤:
快速非支配排序就是将解集分解为不同次序的Pareto前沿的过程。
它可以描述为:

  • 1.为每个解p分配两个关键量:支配p的解个数n_p以及被p支配的解集S_p;
  • 2.设置i=1,将n_p=0的个体归入F_i;
  • 3.对于F_i中的个体,遍历每个解p的S_p,将其中每个解的n_p减1;
  • 4.i+=1,将n_p=0的解归入F_i;
  • 5.重复3、4,直到解集中所有个体都被归入某一个F_i。

2.1快速非支配排序 python实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2021/10/26
#@email:1344732766@qq.com
#============导入相关包========
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

#==========定义两个目标函数=============
# 定义函数1
def function1(x):
    value = -(x+2) ** 2+2*x
    return value
# 定义函数2
def function2(x):
    value = -(x - 2) ** 2
    return value

#=========定义群体,并绘制初始解的分布图=====
pop_size = 10
max_gen = 100
# 迭代次数
#Initialization
min_x=-10
max_x=10
np.random.seed(10)#固定随机数种子,使每次生成的初始解集一样
solution=np.random.uniform(min_x,max_x,pop_size) #生成的初始解集


#函数1 对应的初始目标函数值
values1=map(function1,solution) #python中的map用法,可以对遍历一个列表如solution,然后将列表元素传入到函数function1。得到解。得到的格式为对象
values1=[i for i in values1] #因为上一步得到是对象格式,需要转换成列表格式

#函数2 对应的初始目标函数值
values2=map(function2,solution) #python中的map用法,可以对遍历一个列表如solution,然后将列表元素传入到函数function2。得到解。得到的格式为对象
values2=[i for i in values2] #因为上一步得到是对象格式,需要转换成列表格式

plt.scatter(values1,values2, s=20, marker='o')
for i in range(pop_size):
    plt.annotate(i, xy=(values1[i], values2[i]), xytext=(values1[i] - 0.05, values2[i] - 0.05),fontsize=18)
plt.xlabel('function1')
plt.ylabel('function2')
plt.title('解的分布示意图')
plt.show()

#=================快速非支配排序==============
'''

1.n[p]=0 s[p]=[] 
2.对所有个体进行非支配判断,若p支配q,则将q加入到S[p]中,并将q的层级提升一级。
  若q支配p,n[p]+1.
3.找出种群中np=0的个体,即最优解,并找到最优解的支配解集合。存放到front[0]中
4 i==0
5.判断front是否为空,若不为空,将front中所有的个体sp中对应的被支配个体数减去1,(存放np==0的解序号进front[i+1]);i=i+1,跳到2;
  若为空,则表明得到了所有非支配集合,程序结束
'''

values=[values1,values2] #解集【目标函数1解集,目标函数2解集...】
def fast_non_dominated_sort(values):
    """
    优化问题一般是求最小值
    :param values: 解集【目标函数1解集,目标函数2解集...】
    :return:返回解的各层分布集合序号。类似[[1], [9], [0, 8], [7, 6], [3, 5], [2, 4]] 其中[1]表示Pareto 最优解对应的序号
    """
    values11=values[0]#函数1解集
    S = [[] for i in range(0, len(values11))]#存放 每个个体支配解的集合。
    front = [[]] #存放群体的级别集合,一个级别对应一个[]
    n = [0 for i in range(0, len(values11))]#每个个体被支配解的个数 。即针对每个解,存放有多少好于这个解的个数
    rank = [np.inf for i in range(0, len(values11))]#存放每个个体的级别



    for p in range(0, len(values11)):#遍历每一个个体
        # ====得到各个个体 的被支配解个数 和支配解集合====
        S[p] = [] #该个体支配解的集合 。即存放差于该解的解
        n[p] = 0  #该个体被支配的解的个数初始化为0  即找到有多少好于该解的 解的个数
        for q in range(0, len(values11)):#遍历每一个个体
            less = 0 #的目标函数值小于p个体的目标函数值数目
            equal = 0 #的目标函数值等于p个体的目标函数值数目
            greater = 0 #的目标函数值大于p个体的目标函数值数目
            for k in range(len(values)):  # 遍历每一个目标函数
                if values[k][p] > values[k][q]:  # 目标函数k时,q个体值 小于p个体
                    less = less + 1  # q比p 好
                if values[k][p] == values[k][q]:  # 目标函数k时,p个体值 等于于q个体
                    equal = equal + 1
                if values[k][p] < values[k][q]:  # 目标函数k时,q个体值 大于p个体
                    greater = greater + 1  # q比p 差

            if (less + equal == len(values)) and (equal != len(values)):
                n[p] = n[p] + 1  # q比p,  比p好的个体个数加1

            elif (greater + equal == len(values)) and (equal != len(values)):
                S[p].append(q)  # q比p差,存放比p差的个体解序号

        #=====找出Pareto 最优解,即n[p]===0 的 个体p序号。=====
        if n[p]==0:
            rank[p] = 0 #序号为p的个体,等级为0即最优
            if p not in front[0]:
                # 如果p不在第0层中
                # 将其追加到第0层中
                front[0].append(p) #存放Pareto 最优解序号

    # =======划分各层解========

    """
    #示例,假设解的分布情况如下,由上面程序得到 front[0] 存放的是序号1
    个体序号    被支配个数   支配解序号   front
    1          0            2,3,4,5    0
    2,         1,          3,4,5
    3,        1,           4,5
    4,        3,           5
    5          4,           0

    #首先 遍历序号1的支配解,将对应支配解[2,3,4,5] ,的被支配个数-1(1-1,1-1,3-1,4-1)
    得到
    表
    个体序号    被支配个数   支配解序号   front
    1          0            2,3,4,5    0
    2,         0,          3,4,5
    3,        0,           4,5
    4,        2,           5
    5          2,           0

    #再令 被支配个数==0 的序号 对应的front 等级+1
    得到新表...
    """
    i = 0
    while (front[i] != []):  # 如果分层集合为不为空
        Q = []
        for p in front[i]:  # 遍历当前分层集合的各个个体p
            for q in S[p]:  # 遍历p 个体 的每个支配解q
                n[q] = n[q] - 1  # 则将fk中所有给对应的个体np-1
                if (n[q] == 0):
                    # 如果nq==0
                    rank[q] = i + 1
                    if q not in Q:
                        Q.append(q)  # 存放front=i+1 的个体序号

        i = i + 1  # front 等级+1
        front.append(Q)

    del front[len(front) - 1]  # 删除循环退出 时 i+1产生的[]

    return front #返回各层 的解序号集合 # 类似[[1], [9], [0, 8], [7, 6], [3, 5], [2, 4]]

front=fast_non_dominated_sort(values)


#=================打印结果=======================
#遍历各层
for i in range(len(front)):
    print('第%d层,解的序号为%s'%(i,front[i]))
    jie=[]
    for j in front[i]:#遍历第i层各个解
        jie.append(solution[j])
    print('第%d层,解为%s'%(i,jie))

结果如图,发现成功找到最优解

3.拥挤距离

      拥挤距离的定义
      在NSGA-II中,为了衡量在同一个前沿中各个解质量的优劣,作者为每个解分配了一个拥挤距离,其背后的思想是让求得的Pareto最优解在objective space中尽量分散,也就有更大可能让解在Pareto最优前沿上均匀分布。

      拥挤距离主要是维持种群中个体的多样性。具体而言,一般来说 是指种群按照支配关系进行非支配排后单个Rank层中个体的密集程度。常用于支配关系的多目标算法中,例如NSGA-1I.

主要步骤如下:

  • 取单个前沿中个体按照一个目标上的值从小到大排序
  • 将最大目标值作为max,最小目标值保留作为min。并且这两个极值点的拥挤距离都被设置为inf即无穷大。因此注意,一个层中可能有多个具有inf的点,即如果层中有多个点在至少一个目标上相等,并且最大或最小,那么这些点的拥挤距离都是无穷大! !因为目标上呈现垂直的关系也是属于非支配的关系! !如果出现这种情况,说明你算法的多样性很烂! ~或者在某些算法早期可能出现这种情况
  • 在这个目标上计算每个个体最相邻个体之间的距离,即i-1和i+1的目标值的差。 并使用max和min对次值进行归一化。
  • 遍历目标,将目标上已经归一化的拥挤距离相加。
  • 进入下一层front前沿
  • 拥挤距离越大越好,最后按照拥挤距离重新排序各层,进而排序种群。

3.1 拥挤距离python 实现

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# @Author: yudengwu(余登武)
# @Date  : 2021/10/27
#@email:1344732766@qq.com
#============导入相关包========
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import matplotlib; matplotlib.use('TkAgg')
mpl.rcParams['font.sans-serif'] = ['SimHei']  # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False  # 解决保存图像是负号'-'显示为方块的问题

#==========定义两个目标函数=============
# 定义函数1
def function1(x):
    y = (x - 1) ** 2
    return y
# 定义函数2
def function2(x):
    y = np.cos(x)
    return y

#=========定义群体,并绘制初始解的分布图=====
pop_size = 50
max_gen = 100
# 迭代次数
#Initialization
min_x=-10
max_x=10
np.random.seed(10)#固定随机数种子,使每次生成的初始解集一样
solution=np.random.uniform(min_x,max_x,pop_size) #生成的初始解集


#函数1 对应的初始目标函数值
values1=map(function1,solution) #python中的map用法,可以对遍历一个列表如solution,然后将列表元素传入到函数function1。得到解。得到的格式为对象
values1=[i for i in values1] #因为上一步得到是对象格式,需要转换成列表格式

#函数2 对应的初始目标函数值
values2=map(function2,solution) #python中的map用法,可以对遍历一个列表如solution,然后将列表元素传入到函数function2。得到解。得到的格式为对象
values2=[i for i in values2] #因为上一步得到是对象格式,需要转换成列表格式

plt.scatter(values1,values2, s=20, marker='o')
for i in range(pop_size):
    plt.annotate(i, xy=(values1[i], values2[i]), xytext=(values1[i] - 0.05, values2[i] - 0.05),fontsize=18)
plt.xlabel('function1')
plt.ylabel('function2')
plt.title('解的分布示意图')
plt.show()


#=================快速非支配排序==============
values=[values1,values2] #解集【目标函数1解集,目标函数2解集...】
def fast_non_dominated_sort(values):
    """
    优化问题一般是求最小值
    :param values: 解集【目标函数1解集,目标函数2解集...】
    :return:返回解的各层分布集合序号。类似[[1], [9], [0, 8], [7, 6], [3, 5], [2, 4]] 其中[1]表示Pareto 最优解对应的序号
    """
    values11=values[0]#函数1解集
    S = [[] for i in range(0, len(values11))]#存放 每个个体支配解的集合。
    front = [[]] #存放群体的级别集合,一个级别对应一个[]
    n = [0 for i in range(0, len(values11))]#每个个体被支配解的个数 。即针对每个解,存放有多少好于这个解的个数
    rank = [np.inf for i in range(0, len(values11))]#存放每个个体的级别

    for p in range(0, len(values11)):#遍历每一个个体
        # ====得到各个个体 的被支配解个数 和支配解集合====
        S[p] = [] #该个体支配解的集合 。即存放差于该解的解
        n[p] = 0  #该个体被支配的解的个数初始化为0  即找到有多少好于该解的 解的个数
        for q in range(0, len(values11)):#遍历每一个个体
            less = 0 #的目标函数值小于p个体的目标函数值数目
            equal = 0 #的目标函数值等于p个体的目标函数值数目
            greater = 0 #的目标函数值大于p个体的目标函数值数目
            for k in range(len(values)):  # 遍历每一个目标函数
                if values[k][p] > values[k][q]:  # 目标函数k时,q个体值 小于p个体
                    less = less + 1  # q比p 好
                if values[k][p] == values[k][q]:  # 目标函数k时,p个体值 等于于q个体
                    equal = equal + 1
                if values[k][p] < values[k][q]:  # 目标函数k时,q个体值 大于p个体
                    greater = greater + 1  # q比p 差

            if (less + equal == len(values)) and (equal != len(values)):
                n[p] = n[p] + 1  # q比p,  比p好的个体个数加1

            elif (greater + equal == len(values)) and (equal != len(values)):
                S[p].append(q)  # q比p差,存放比p差的个体解序号

        #=====找出Pareto 最优解,即n[p]===0 的 个体p序号。=====
        if n[p]==0:
            rank[p] = 0 #序号为p的个体,等级为0即最优
            if p not in front[0]:
                # 如果p不在第0层中
                # 将其追加到第0层中
                front[0].append(p) #存放Pareto 最优解序号

    # =======划分各层解========

    i = 0
    while (front[i] != []):  # 如果分层集合为不为空
        Q = []
        for p in front[i]:  # 遍历当前分层集合的各个个体p
            for q in S[p]:  # 遍历p 个体 的每个支配解q
                n[q] = n[q] - 1  # 则将fk中所有给对应的个体np-1
                if (n[q] == 0):
                    # 如果nq==0
                    rank[q] = i + 1
                    if q not in Q:
                        Q.append(q)  # 存放front=i+1 的个体序号

        i = i + 1  # front 等级+1
        front.append(Q)

    del front[len(front) - 1]  # 删除循环退出 时 i+1产生的[]

    return front #返回各层 的解序号集合 # 类似[[1], [9], [0, 8], [7, 6], [3, 5], [2, 4]]

front=fast_non_dominated_sort(values)


#=============拥挤距离================
def crowding_distance(values,front):
    """
    :param values: 群体[目标函数值1,目标函数值2,...]
    :param front: 群体解的等级,类似[[1], [9], [0, 8], [7, 6], [3, 5], [2, 4]]
    :return: front 对应的 拥挤距离
    """
    distance = np.zeros(shape=(pop_size, ))  # 拥挤距离初始化为0
    for rank in front:  # 遍历每一层Pareto 解 rank为当前等级
        for i in range(len(values)):  # 遍历每一层函数值(先遍历群体函数值1,再遍历群体函数值2...)
            valuesi = [values[i][A] for A in rank]  # 取出rank等级 对应的  目标函数值i 集合
            rank_valuesi = zip(rank, valuesi)  # 将rank,群体函数值i集合在一起
            sort_rank_valuesi = sorted(rank_valuesi, key=lambda x: (x[1],x[0]))  # 先按函数值大小排序,再按序号大小排序

            sort_ranki = [j[0] for j in sort_rank_valuesi]  # 排序后当前等级rank
            sort_valuesi = [j[1] for j in sort_rank_valuesi]  # 排序后当前等级对应的 群体函数值i
            #print(sort_ranki[0],sort_ranki[-1])
            distance[sort_ranki[0]] = np.inf  # rank 等级 中 的最优解 距离为inf
            distance[sort_ranki[-1]] = np.inf  # rank 等级 中 的最差解 距离为inf

            #计算rank等级中,除去最优解、最差解外。其余解的拥挤距离
            for j in range(1, len(rank) - 2):
                distance[sort_ranki[j]] = distance[sort_ranki[j]] + (sort_valuesi[j + 1] - sort_valuesi[j - 1]) / (
                            max(sort_valuesi) - min(sort_valuesi))  # 计算距离


    # 按照格式存放distances
    distanceA = [[] for i in range(len(front))]  #
    for j in range(len(front)):  # 遍历每一层Pareto 解 rank为当前等级
        for i in range(len(front[j])):  # 遍历给rank 等级中每个解的序号
            distanceA[j].append(distance[front[j][i]])

    return distanceA


distanceA=crowding_distance(values,front)

#打印拥挤距离结果


for i in range(len(front)):
    print('当前等级 解的序号为:',front[i])
    print('当前等级 解的拥挤距离为:',distanceA[i])


4.精英选择策略

      多目标优化过程中,得到父辈和子代解后,我们需要选择优秀的群体进行下一代。
      这里采用精英选择策略

4.1 精英选择策略python 实现

#这里的front,distance,solution 数据格式同前文

 def elitism(self,front, distance, solution):
        """
        精英选择策略
        :param front: 父代与子代 组合构成的解的等级
        :param distance:  父代与子代 组合构成的解 拥挤距离
        :param solution:  父代与子代 组合构成的解
        :return:  返回群体解。群体数量=(父代+子代)//2
        """
        X1index = []  # 存储群体编号
        pop_size = len(solution) // 2  # 保留的群体个数 即(父辈+子辈)//2

        for i in range(len(front)):  # 遍历各层
            rank_distancei = zip(front[i], distance[i])  # 当前等级 与当前拥挤距离的集合
            sort_rank_distancei = sorted(rank_distancei, key=lambda x: (x[1], x[0]),
                                         reverse=True)  # 先按拥挤距离大小排序,再按序号大小排序,逆序
            sort_ranki = [j[0] for j in sort_rank_distancei]  # 排序后当前等级rank
            sort_distancei = [j[1] for j in sort_rank_distancei]  # 排序后当前等级对应的 拥挤距离i

            if (pop_size - len(X1index)) >=len(sort_ranki):  # 如果X1index还有空间可以存放当前等级i 全部解
                X1index.extend([A for A in sort_ranki])

            #print('已存放len(X1index)', len(X1index))
            #print('当前等级长度', len(sort_ranki))
            #print('需要存放的总长度,popsize)
            #num = pop_size-len(X1index)# X1index 还能存放的个数
            elif len(sort_ranki) > (pop_size-len(X1index)):  # 如果X1空间不可以存放当前等级i 全部解
                num = pop_size - len(X1index) 
                X1index.extend([A for A in sort_ranki[0:num]])
        X1 = [solution[i] for i in X1index]

        return X1


总结

      本文通定义两个目标函数,然后生成初始解。利用初始解,解释了核心知识点:快速非支配排序、拥挤距离、精英选择策略。本文的文字部分有借鉴他人博客。代码为自己纯手打。下一步,将快速非支配排序、拥挤距离、精英选择策略写进遗传算法,解决常规约束、带复杂约束问题(可能需要修改下快速非支配排序代码,因为复杂约束不仅仅考虑适应度,还有惩罚项在里面)构成多目标优化问题代码模板。
多目标遗传优化算法nsga2[python源码实现]
多目标遗传优化算法nsga2求解复杂约束问题【python源码实现】

经实验:快速非支配排序、拥挤距离、精英选择策略 无法应用于粒子群算法。因为无法定义pbest,gbest。
在这里插入图片描述
作者:电气-余登武。原创不易,禁止抄袭。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

nsga2多目标优化之核心知识点(快速非支配排序、拥挤距离、精英选择策略)详解(python实现) 的相关文章

  • Django:ImageField 需要文件路径还是实际的图像对象?

    Running Windows 7 Python 3 3 Django 1 6 我对如何将图像存储为 Django 数据库中表的一部分感到困惑 有一个领域叫做ImageField 这是Docs https docs djangoprojec
  • 在Python中读取PDF属性/元数据

    如何使用 Python 读取 PDF 文件中存储的属性 元数据 例如标题 作者 主题和关键字 Try pdfminer https github com euske pdfminer from pdfminer pdfparser impo
  • 带有元数据的 scipy kdtree

    我目前正在寻找一种方法来构建几个 kd 树以快速查询一些 n 维数据 但是 我对 scipy KD 树算法有一些问题 我的数据包括id gt data somedata coordinate x y 我希望能够基于坐标和 k 最近邻居的 i
  • 如何计算Numpy数组中特定范围内的值?

    我有一个 NumPy 值数组 我想计算有多少个值在特定范围内 例如 x25 我已阅读有关计数器的信息 但它似乎仅对特定值有效 对值范围无效 我已经搜索过 但没有找到任何关于我的具体问题的信息 如果有人能指出我正确的文档 我将不胜感激 谢谢
  • Python - 对象 MagicMock 不能在“await”表达式中使用

    当我尝试使用 MagicMock 在单元测试中模拟异步函数时 出现以下异常 类型错误 对象 MagicMock 不能在 await 表达式中使用 示例代码如下 source code class Service async def comp
  • XGBoost 产生预测结果和概率

    我可能正在文档中查看它 但我想知道 XGBoost 是否有办法生成结果的预测和概率 就我而言 我正在尝试预测多类分类器 如果我能返回Medium 88 那就太好了 分类器 中 预测概率 88 参数 params max depth 3 ob
  • Python daysBetweenDate

    我想我可能有一个无限循环 因为每当我运行代码时 我都会收到一条错误消息 它说 程序因使用 13 CPU 秒而关闭 整个代码 应该以日期作为输入并输出第二天 此代码假设所有月份都是 30 天 除了daysBetweenDates功能正常 其他
  • 在 Windows 7 上安装 Python Fabric 时出现问题

    我正在尝试使用以下指南在 Windows 7 上安装 Python Fabric在 Windows 上安装 Python 和 Fabric http www jonnyreeves co uk 2011 08 getting python
  • 在自定义 Dask 图中包含关键字参数 (kwargs)

    我正在使用 Dask 为一项操作构建自定义图表 熟悉如何将参数传递给 Dask 图中的函数 并阅读了docs http dask pydata org en latest custom graphs html 然而似乎还是缺少了一些东西 D
  • 使用 Pandas 解析时避免 Excel 的科学记数法舍入

    我有一个自动生成的 Excel 文件 其中偶尔包含非常大的数字 例如135061808695 在 Excel 文件中 当您单击单元格时 它会显示完整的数字135061808695然而 在视觉上 使用自动 常规 格式 数字显示为1 35063
  • 如何将字符串列表转换为正确的 Python 类型?

    给定一个 python 字符串列表 如何自动将它们转换为正确的类型 意思是 如果我有 hello 3 3 64 1 我希望将其转换为列表 hello 3 3 64 1 其中第一个元素是字符串 第二个元素是 int 第三个元素是 float
  • 使用 pybind11 修改 std::array 的默认值

    我的目标是修改在中声明的数组C struct并赋予默认值 我读过了this https pybind11 readthedocs io en stable advanced cast stl html making opaque types
  • NoneType 类型的对象没有 len

    def medianeven L while len L gt 2 L L 1 len L 1 return average L def medianodd L while len L gt 1 L L 1 len L 1 return L
  • 使用 Click 在 python 中创建命令行应用程序

    我正在使用 Python 创建一个命令行应用程序Click http click pocoo org 接受名称作为输入的库 但如果未输入名称 则返回默认值 这是我到目前为止的代码 hello py import click click ve
  • 如何使用Python从Excel复制图表并将其作为图表粘贴到powerpoint(而不是图像)中

    我有一个excel文件 它根据可用数据生成图表 图表名称是thisChart 我想复制thisChart从 excel 文件到 ppt 文件 现在我知道有两种方法可以做到这一点 即VBA和python 使用win32com client V
  • 如何在Python中比较枚举?

    从 Python 3 4 开始 Enum类存在 我正在编写一个程序 其中一些常量具有特定的顺序 我想知道哪种方式最适合比较它们 class Information Enum ValueOnly 0 FirstDerivative 1 Sec
  • 在Python中寻找坐标系中某些点之间的最短路径

    我编写了一个代码 可以在坐标系中的特定宽度和长度范围内生成所需数量的点 它计算并列出我使用欧几里德方法生成的这些点的距离矩阵 我的代码在这里 import pandas as pd from scipy spatial import dis
  • 识别左侧由 delta 链接的簇,右侧由不同 delta 链接的簇

    考虑排序后的数组a a np array 0 2 3 4 5 10 11 11 14 19 20 20 如果我指定了左增量和右增量 delta left delta right 1 1 这就是我期望的集群分配方式 a 0 2 3 4 5 1
  • Python FFmpeg查询rtsp太慢

    目前 我正在尝试使用 python 和 FFmpeg 来查询原始格式为 h264 的 rtsp 数据 直播流视频的信息为 fps 29 分辨率 1280 720 我希望我可以以相同的格式 h264 查询数据并将其放入python队列中以便将
  • 为什么 Pytest 对夹具参数执行嵌套循环

    使用 Pytest 我想编写一个测试函数 该函数接受多个装置作为参数 每个灯具都有几个参数 例如 test demo py 中是一个函数test squared is less than 10需要固定装置 negative integer

随机推荐