使用查找表自定义矩阵点积

2024-05-13 03:28:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个数组,包含约80000个数组,每个数组的长度为6

large = [['A' 'B' 'C' 'D' 'E' 'F']
         ['A' 'B' 'C' 'D' 'E' 'G']
         ['A' 'B' 'C' 'D' 'E' 'H']
         ['A' 'B' 'C' 'D' 'E' 'K']
         ['A' 'B' 'C' 'D' 'E' 'L']
         ['A' 'B' 'C' 'D' 'E' 'M']
         ['A' 'B' 'C' 'D' 'E' 'N']
         ['A' 'B' 'C' 'D' 'O' 'X']
         ['A' 'B' 'C' 'D' 'O' 'Y']
         ['A' 'B' 'C' 'D' 'O' 'Z']
         ...
         ]

我还有一个小数组,small = ['K' 'L' 'M' 'N' 'O' 'P']

我需要使用查找表(dataframe)将small的每个元素与large中子数组的每个元素进行比较:

              Key   A   B    C    D    E
0             A         xx   yy   zz   hh 
1             B     akj      gh   xc   op 
2             C     gh  xx        qq   kbu 
3             D     fg  xx   lk        cbv 
4             E     jhk xx   ry   dsg   
...           ...

对于每个查找,我需要获取值并将其传递给函数:

def myfunc(val):
    # do something with val...
    return some_number_based_on_val

例如,第一个比较可能是:['K' 'L' 'M' 'N' 'O' 'P']['A' 'B' 'C' 'D' 'E' 'F'],结果是[6,43,76,12,9,1]。最后,我会把这些数字加起来

它本质上是一种类似点积的操作,但具有自定义功能。 因此,所需的输出将是8000x1阵列

我如何才能有效地做到这一点?按顺序执行此操作意味着要进行约480000次查找,而且看起来相当缓慢


Tags: key元素dataframehhval数组ghsmall
1条回答
网友
1楼 · 发布于 2024-05-13 03:28:07

由于您使用的是熊猫,因此可以使用熊猫的贴图:

# build series, assuming `Key` is index of lookup
s = lookup.stack().map({'xx':10, 'akj':12})

# reindex to get the lookup values
mapped_val = s.reindex(pd.MultiIndex.from_tuples(zip(large.ravel(), np.tile(small, large.shape[1]))))

# groupby then sum
mapped_val.groupby(np.repeat(np.arange(large.shape[0]), large.shape[1])).sum()

将它们链接在一起:

(lookup.stack().map({'xx':10, 'akj':12})
       .reindex(pd.MultiIndex.from_tuples(zip(large.ravel(), 
                                              np.tile(small, large.shape[1])))
               )
       .groupby(np.repeat(np.arange(large.shape[0]), large.shape[1])).sum()
)

相关问题 更多 >