Python 通过numpy阵列的最小和路由

Python 通过numpy阵列的最小和路由,python,algorithm,numpy,math,Python,Algorithm,Numpy,Math,这是一个由两部分组成的问题 第1部分 给定以下Numpy数组: foo = array([[22.5, 20. , 0. , 20. ], [24. , 40. , 0. , 8. ], [ 0. , 0. , 50. , 9.9], [ 0. , 0. , 0. , 9. ], [ 0. , 0. , 0. , 2.5]]) (i)查找跨列的两个最小可能值之和(仅考虑

这是一个由两部分组成的问题

第1部分

给定以下Numpy数组:

foo = array([[22.5, 20. ,  0. , 20. ],
             [24. , 40. ,  0. ,  8. ],
             [ 0. ,  0. , 50. ,  9.9],
             [ 0. ,  0. ,  0. ,  9. ],
             [ 0. ,  0. ,  0. ,  2.5]])
(i)查找跨列的两个最小可能值之和(仅考虑大于零的单元格值),其中每列仅使用一行,以及(ii)跟踪该路由上访问的数组索引位置,最有效的方法是什么

例如,在上面的示例中,这将是:
索引
[0,0]、[0,1]、[2,2]、[4,3]
索引
[0,0]、[0,1]、[2,2]、[2,2]、[1,3]
处的最小条码=22.5+20+50+8=100.5

第二部分

与第1部分类似,但现在有一个约束条件,即
foo
(如果在解决方案中使用该行)的行和必须大于数组中的值(例如
np.array([10,10,10,10,10,10,10])
。换句话说
sum(行[0])array[0]=62.5>10=True
sum(行)[4] )>数组[4]=2.5>10=False

在这种情况下,结果是:
在索引
[0,0]、[0,1]、[2,2]、[2,3]、
在索引
[0,0]、[0,1]、[2,2]、[2,2]、[0,3]、
处的最小值=22.5+20+50+9.9=102.4
下一个最佳值=22.5+20+50+20=112.5


我最初的方法是找到所有可能的路径(使用
itertools
的索引组合),但这种解决方案不能很好地适用于大型矩阵(例如,
mxn=500x500
)。

我提出了一个解决方案(希望我没有误解你问题中的任何内容)

要查找索引,请执行以下操作:

np.where(foo == minimum_bar)
np.where(foo == next_best_bar)

我想出了一个解决方案(希望我没有误解你问题中的任何内容)

要查找索引,请执行以下操作:

np.where(foo == minimum_bar)
np.where(foo == next_best_bar)

第1部分很简单,您需要清楚地解释第2部分是什么,特别是什么是行总和必须大于数组中的值,如果所有值都为正,那么总和总是大于任何一个值。对于行总和,我的意思是
62.5
对于
行0
72
对于
行1
59。9
对于
第2行
9
对于
第3行
2.5
对于
第4行
。那么with必须大于数组中的值,我的意思是
sum(row[0])>数组[0]
sum(row[1])>数组[1]
等。在我的示例中,我使用了一个10个数组,这可能会让人混淆。如果数组是
np.array([10,20,5,3,25])
那么约束条件是
sum(row[0])>array[0]=62.5>10=True
sum(row[1])>array[1]=72>20=True
,等等。在这两种情况下,您的约束对于严格大于1的行索引都无法保持。您是否打算添加一个条件,即必须在给定行中至少选择一个元素才能包含约束,或者类似的情况?即使如此,在第2部分中的
最小条形图中,为什么会出现给定的解决方案考虑到可行,当索引为1的行中唯一的元素是8,小于10时?@fuglede感谢你的提问。不确定你第一个问题的意思。关于第二个问题,你是对的-已经修改了问题。第一部分很简单,你需要清楚地解释第二部分是什么,尤其是at的行总和必须大于数组中的值,如果所有值都为正,则总和总是大于任何一个值。对于行总和,我的意思是
62.5
对于
行0
72
对于
行1
59.9
对于
行2
9
对于
行3
2.5
对于
第4行
。那么with必须大于数组中的值,我的意思是
sum(行[0])>数组[0]
sum(行[1])>数组[1]
等。在我的示例中,我使用了一个包含所有10个的数组,这可能会让人混淆。如果数组改为
np.array([10,20,5,3,25])
,那么约束条件是
sum(行[0])>数组[0]=62.5>10=True
sum(行[1])>数组[1]=72>20=True
,等等。在这两种情况下,您的约束对于严格大于1的行索引都无法保持。您是否打算添加一个条件,即必须在给定行中至少选择一个元素才能包含约束,或者类似的情况?即使如此,在第2部分中的
最小条形图中,为什么会出现给定的解决方案考虑到可行,当索引为1的行中的唯一元素为8,小于10时?@fuglede感谢你的提问。不确定你的第一个问题是什么意思。关于第二个问题,你是对的-已经修改了问题。我喜欢这种方法,尽管这似乎不能完全解决手头的问题。特别是两件事:(1)你的第2部分没有解决这个问题。如果你只在最后一列中使用第二行(即,
value=8
),如果约束是
sum(row[1])=8>10=False
,这是一个无效的解决方案(2)你寻找索引位置的方法将不起作用(我相信)如果存在具有相同值的多个索引(例如,
22.5
出现在多个地方)。我认为最初的问题措词不当。我对第2部分的意思是,行总和仅根据该路线上使用的指数计算。例如:在最小路线
22.5,20.0,50.0,8.0
中,使用的行是
0行(22.5,20)
第1行(8.0)
第2行(50.0)
。在这种情况下,第0行和第2行都可以,因为
22.5+20>10
50>10
但是第1行不是,因为
8I喜欢这种方法,尽管这似乎不能完全解决手头的问题。特别是两件事:(1)您的第2部分不能解决问题。假设您只在最后一列中使用第二行(即,
value=8
)这是一个
np.where(foo == minimum_bar)
np.where(foo == next_best_bar)