Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pythonic方法获得三维矩阵的所有唯一阶乘组合_Python_Numpy_Math_Combinations_Itertools - Fatal编程技术网

Pythonic方法获得三维矩阵的所有唯一阶乘组合

Pythonic方法获得三维矩阵的所有唯一阶乘组合,python,numpy,math,combinations,itertools,Python,Numpy,Math,Combinations,Itertools,我有两个列表,其中一个看起来像: drivers = ['bob','Lenny','frank','sunny'] cities = ['Austin','San Antonio','Houston'] 另一个看起来像: drivers = ['bob','Lenny','frank','sunny'] cities = ['Austin','San Antonio','Houston'] 这可以很容易地用如下表格表示: | bob | lenny | fr

我有两个列表,其中一个看起来像:

drivers = ['bob','Lenny','frank','sunny']
cities = ['Austin','San Antonio','Houston']
另一个看起来像:

drivers = ['bob','Lenny','frank','sunny']
cities = ['Austin','San Antonio','Houston']
这可以很容易地用如下表格表示:

            |  bob  | lenny | frank | sunny
Austin      |  $45  |  $15  |  $77  |  $33
San Antonio |  $12  |  $23  |  $10  |  $18
Houston     |  $44  |  $99  |  $78  |  $12
所以我想计算所有的有效组合,这意味着我可以让一辆车超出计划,但我不能让一个司机同时在两个城市工作,我不能让一个城市没有司机


有什么想法吗

如果您可以假设城市中的所有城市都是唯一的,您只需生成所有长度
的len(cities)
,并(可选)将它们与城市进行压缩,如:

def valid_combinations(cities,drivers):
    return itertools.permutations(drivers,len(cities))
或者,如果您想将其与城市联系起来:

def valid_combinations(cities,drivers):
    for perm in itertools.permutations(drivers,len(cities)):
        yield zip(cities,perm)
对于我们生成的最后一个:

>>> list(map(tuple,valid_combinations(cities,drivers)))
[(('Austin', 'bob'), ('San Antonio', 'Lenny'), ('Houston', 'frank')),
(('Austin', 'bob'), ('San Antonio', 'Lenny'), ('Houston', 'sunny')),
(('Austin', 'bob'), ('San Antonio', 'frank'), ('Houston', 'Lenny')),
(('Austin', 'bob'), ('San Antonio', 'frank'), ('Houston', 'sunny')),
(('Austin', 'bob'), ('San Antonio', 'sunny'), ('Houston', 'Lenny')),
(('Austin', 'bob'), ('San Antonio', 'sunny'), ('Houston', 'frank')),
(('Austin', 'Lenny'), ('San Antonio', 'bob'), ('Houston', 'frank')),
(('Austin', 'Lenny'), ('San Antonio', 'bob'), ('Houston', 'sunny')),
(('Austin', 'Lenny'), ('San Antonio', 'frank'), ('Houston', 'bob')),
(('Austin', 'Lenny'), ('San Antonio', 'frank'), ('Houston', 'sunny')),
(('Austin', 'Lenny'), ('San Antonio', 'sunny'), ('Houston', 'bob')),
(('Austin', 'Lenny'), ('San Antonio', 'sunny'), ('Houston', 'frank')),
(('Austin', 'frank'), ('San Antonio', 'bob'), ('Houston', 'Lenny')),
(('Austin', 'frank'), ('San Antonio', 'bob'), ('Houston', 'sunny')),
(('Austin', 'frank'), ('San Antonio', 'Lenny'), ('Houston', 'bob')),
(('Austin', 'frank'), ('San Antonio', 'Lenny'), ('Houston', 'sunny')),
(('Austin', 'frank'), ('San Antonio', 'sunny'), ('Houston', 'bob')),
(('Austin', 'frank'), ('San Antonio', 'sunny'), ('Houston', 'Lenny')),
(('Austin', 'sunny'), ('San Antonio', 'bob'), ('Houston', 'Lenny')),
(('Austin', 'sunny'), ('San Antonio', 'bob'), ('Houston', 'frank')),
(('Austin', 'sunny'), ('San Antonio', 'Lenny'), ('Houston', 'bob')),
(('Austin', 'sunny'), ('San Antonio', 'Lenny'), ('Houston', 'frank')),
(('Austin', 'sunny'), ('San Antonio', 'frank'), ('Houston', 'bob')),
(('Austin', 'sunny'), ('San Antonio', 'frank'), ('Houston', 'Lenny'))]
所以在第一种情况下,
'bob'
开车去
'Austin'
'Lenny'
'sanantonio'
'frank'
'Houston'
;在第二种情况下,
'bob'
开车去
'Austin'
'Lenny'
'santanonio'
'sunny'
'Houston'
;等等这里的有效配置总数为2×3×4=24,这也是
产量
ed的元素数量


尽管如此,如果您想找到最佳组合(您的问题还不清楚),您可以使用匈牙利算法的变体在O(n3)中解决此问题。

一种分层表示方法,使用熊猫数据帧:

使用df:

            bob  lenny  frank  sunny
Austin       45     15     77     33
SanAntonio   12     23     10     18
Houston      44     99     78     12
我们可以做到:

m,n=df.shape
idx=[list(t) for t in itertools.permutations(range(n),m) ]
cash=df.values[range(m),idx]
staff=np.take(df.columns.tolist(),idx)
total=pd.DataFrame(index=staff,data=cash,columns=df.index)
total['amount']=cash.sum(axis=1)
print (total.sort_values('amount',ascending=False))
用于:

                       Austin  SanAntonio  Houston  amount
(frank, sunny, lenny)      77          18       99     194
(frank, bob, lenny)        77          12       99     188
(bob, sunny, lenny)        45          18       99     162
(bob, frank, lenny)        45          10       99     154
(bob, lenny, frank)        45          23       78     146
(frank, lenny, bob)        77          23       44     144
(sunny, bob, lenny)        33          12       99     144
(sunny, frank, lenny)      33          10       99     142
(bob, sunny, frank)        45          18       78     141
(frank, sunny, bob)        77          18       44     139
(sunny, lenny, frank)      33          23       78     134
(sunny, bob, frank)        33          12       78     123
(frank, lenny, sunny)      77          23       12     112
(lenny, sunny, frank)      15          18       78     111
(lenny, bob, frank)        15          12       78     105
(frank, bob, sunny)        77          12       12     101
(sunny, lenny, bob)        33          23       44     100
(sunny, frank, bob)        33          10       44      87
(bob, lenny, sunny)        45          23       12      80
(lenny, sunny, bob)        15          18       44      77
(lenny, frank, bob)        15          10       44      69
(bob, frank, sunny)        45          10       12      67
(lenny, bob, sunny)        15          12       12      39
(lenny, frank, sunny)      15          10       12      37

你能假设
城市中的所有元素都是唯一的吗?既然OP说他可以将司机排除在时间表之外,但不能同时将两个司机放在同一个城市,那么会不会有更多有效的组合将一个或多个司机排除在外?我不确定我是否理解正确,因此我希望得到澄清。@batbrat:因为每个附表中有三个城市和四名司机,一名司机被排除在外。例如
'sunny'
没有在第一个时间表中驾驶。啊!我错过了显而易见的机会!谢谢你澄清这一点。如果我们能在一个城市里有两名司机,那就可以包括在内,对吗?我意识到这是对OPs问题的一种偏离:我只是觉得自己很好奇。事实上,我正在寻找的是最佳组合,现在我正在使用的矩阵约为15x20,使用这种方法计算需要时间,这是我最初问题的正确答案。@WillemVanOnsem您能分享一下如何用匈牙利算法解决最佳组合问题吗?这显然不是我的专长领域。非常感谢。我一直在尝试此操作,但一直在点击:
indexer错误:形状不匹配:索引数组无法与形状(3、)(0、)一起广播。
mmmh。。。。idx似乎是空的。df.shape必须是(3,4),len(idx)必须是24,len(idx[0])=3。你能查一下吗?