方法#1
我们可以使用np.unique 和np.bincount 的组合-
In [48]: unq, ids = np.unique(A, return_inverse=True)
In [49]: dict(zip(unq, np.bincount(ids, b)))
Out[49]:
{'a-1': 11.210000000000001,
'b-1': 4.4400000000000004,
'c-2': 11.199999999999999}
因此,np.unique 为A 中的每个字符串提供了唯一的整数映射,然后将其馈送到np.bincount,后者将这些整数用作基于bin 的加权求和的bin,权重来自b。
方法 #2(特定情况)
假设A 中的字符串总是3 字符,更快的方法是将这些字符串转换为数字,然后将它们用作np.unique 的输入。这个想法是np.unique 处理数字比处理字符串更快。
因此,实现将是 -
In [141]: n = A.view(np.uint8).reshape(-1,3).dot(256**np.arange(3))
In [142]: unq, st, ids = np.unique(n, return_index=1, return_inverse=1)
In [143]: dict(zip(A[st], np.bincount(ids, b)))
Out[143]:
{'a-1': 11.210000000000001,
'b-1': 4.4400000000000004,
'c-2': 11.199999999999999}
神奇的部分是viewing在重塑后仍然是一个视图,因此应该非常有效:
In [150]: np.shares_memory(A,A.view(np.uint8).reshape(-1,3))
Out[150]: True
或者我们可以使用np.unique的axis参数(在1.13.0中添加的功能)-
In [160]: A2D = A.view(np.uint8).reshape(-1,3)
In [161]: unq, st, ids = np.unique(A2D, axis=0, return_index=1, return_inverse=1)
In [162]: dict(zip(A[st], np.bincount(ids, b)))
Out[162]:
{'a-1': 11.210000000000001,
'b-1': 4.4400000000000004,
'c-2': 11.199999999999999}