Python 通过numpy阵列的最小和路由
这是一个由两部分组成的问题 第1部分 给定以下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)查找跨列的两个最小可能值之和(仅考虑
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)