Python 优化选择最佳行

Python 优化选择最佳行,python,algorithm,optimization,Python,Algorithm,Optimization,我有一个二维数组,看起来像这样: 243 432 342 540 150 250 430 100 . . . . . . . . 现在我必须从给定的2d数组中选择一个“整行”,这是“最好的”。“最佳”定义为选择一行,其中第一列是第一列中所有值的最大值(或最接近最大值),第二列是第二列中所有值的最小值(或最接近最小值) 有没有最好的方法来执行这个操作,最好是用python 编辑:在选择行时,第二列的权重更大,为什么不对其排序并取第一个值?可以使用提供排序值的键函数 myData

我有一个二维数组,看起来像这样:

243 432
342 540
150 250
430 100
.   .
.   .
.   .
.   .
现在我必须从给定的2d数组中选择一个“整行”,这是“最好的”。“最佳”定义为选择一行,其中第一列是第一列中所有值的最大值(或最接近最大值),第二列是第二列中所有值的最小值(或最接近最小值)

有没有最好的方法来执行这个操作,最好是用python


编辑:在选择行时,第二列的权重更大,为什么不对其排序并取第一个值?可以使用提供排序值的键函数

myData = [                                                                       
    [1.0, 2.0, 3.0, 4.0],                                                        
    [1.1, 2.1, 3.1, 4.1],                                                        
    [1.2, 2.2, 3.2, 4.2],                                                        
    [1.3, 2.3, 3.3, 4.3]                                                         
]
w1 = 1    # First column weight
w2 = 2    # Second column weight                                                       

myRow = sorted(myData, key=lambda x: w2 * x[1] - w1 * x[0])[0]                         
print(myRow)
如果没有对数据的任何限制,就无法在比线性时间更快的时间内完成此操作

  • 设maxval为max(col0)和minval-min(col1)
  • 使用下面的排序函数对矩阵中的行进行排序
  • 取排序数组的第一项
  • def mycmp(a,b):
    ret=cmp(a[1]-minval,b[1]-minval)
    如果ret!=0:
    回程网
    返回cmp(maxval-a[0],maxval-b[0])
    matrix.sort(cmp=mycmp)
    打印“最优:”,矩阵[0]
    
  • 按第二列升序排序
  • 选择第二列中最小的所有行(它们在排序数组中位于第一位)
  • 按第一列降序排列这些行
  • 第一排是你的“最佳”
  • 如果这不是您想要的,那么您需要更精确地指定何时权衡较小的第二列值和较大的第一行值

    如果无法仅对数组的一部分进行排序(步骤3),只要排序稳定,也可以使用步骤3、1、4


    请注意,这不是最佳算法,但它相当接近。

    您有更好的度量方法吗?您有一个不是很清楚的度量方法吗?你能把第一列和第二列的差值取出来,然后找出最大值吗?“最佳”没有精确定义。如果一行具有第二高和第二低的值,而另一行具有最高和第三低的值,那么什么是最好的?上一个问题的答案是否取决于到这些值中的最大值/最小值的距离?第二列在选择过程中具有更大的权重。假设您递给我一张打印有阵列数据的纸。您对我的指示是什么,这样我就可以找到“最佳”行,而无需再问您任何问题?应该是:找到第一个值在其列中为最大值(或最接近最大值),第二个值在其相应列中为最小值(或最接近最小值)的行*()=精确对不可用的地方在
    myData=[[1.0,2.0],[1.1,2.0]]上此失败
    @jazzpi在中失败?这些数据给了我
    [1.1,2.0]
    ,据我所知,这是正确的。它给了我
    [1.0,2.0]
    。你确定你复制了准确的代码吗?因为a
    reverse=True
    为我提供了正确的结果。@jazzpi你说得对,在SO中键入时交换了标记。感谢您的捕获,它已编辑。“排序”将根据条件对整个数组进行排序,即nlogn。但是,您不需要排序,只需要“最佳”行。因此,检查每一行并返回由以下条件计算的最大值:w2*x[1]-w1*x[0]注意,
    list.sort
    将列表排序到位,这可能会带来不便。通常使用
    排序
    更方便。