2016-06-10 86 views
2

我有类似下面的数组:总和numpy的数组值

a=[["tennis","tennis","golf","federer","cricket"], 
    ["federer","nadal","woods","sausage","federer"], 
    ["sausage","lion","prawn","prawn","sausage"]] 

然后我有以下的权重矩阵

w=[[1,3,3,4,5], 
    [2,3,2,3,4], 
    [1,2,1,1,1]] 

什么我期待那么就是根据每行的矩阵a的标签对权重求和,并从该行取前三个标签。所以在最后,我想是这样的:

res=[["cricket","tennis","federer"], 
    ["federer","sausage","nadal"], 
    ["lion","sausage","prawn"]] 

在我的实际数据集的关系将是非常不可能的,且不是一个真正的关注,也为这里说的整行的情况:

["federer","federer","federer","federer","federer"] 

理想情况下,我希望这将返回为 [“federer”,“”,“”]。

任何指导,将不胜感激。

回答

2

尝试:

print pd.DataFrame(
    {i: a.loc[i, row.sort_values(ascending=False).index[:3]].values for i, row in w.iterrows()} 
).T 

     0  1  2 
0 cricket federer golf 
1 federer sausage nadal 
2  lion sausage prawn 
+0

其实这是否选择基于权重的总和? – Colin

3

为numpy的阵列见piRSquared answer

这是一个纯Python的方法:

for i in range(4): 
    if a[i].count(a[i][0]) == len(a[i]): 
     res = [a[1][0], "", ""] 
    else: 
     res = [x[0] for x in sorted(zip(a[i], w[i]), key=lambda c: c[1], reverse=True)[:3]] 

    print(res) 
1

我设法得到它使用下面的代码工作:

def myf(a,w): 

    lookupTable, indexed_dataSet = np.unique(a, return_inverse=True) 
    y= np.bincount(indexed_dataSet,w) 
    lookupTable[y.argsort()] 
    res=(lookupTable[y.argsort()][::-1][:3]) 
    ret=np.empty((3)) 
    ret.fill(res[-1]) 
    ret[0:res.shape[0]]=res 
    return ret 

result = np.empty_like(knearest_labels[:,0:3]) 
for i,(x,y) in enumerate(zip(a,w)): 
    result[i] = myf(x,y)