python - 快速 python 算法(在 numpy 或 pandas 中?)查找与另一个数组中的元素匹配的数组元素的索引

标签 python performance algorithm numpy pandas

我正在寻找一种快速方法来确定两个数组的交叉匹配索引,定义如下。

我有两个非常大的(>1e7 个元素)结构化数组,一个叫做members,另一个叫做groups。两个数组都有一个 groupID 列。 groups 数组的 groupID 条目是唯一的,members 数组的 groupID 条目不是。

groups 数组有一个名为mass 的列。 members 数组有一个名为 groupmass 的列(当前为空)。我想将正确的 groupmass 分配给 members 的那些元素,其中 groupID 与其中一个组匹配。这将通过以下方式完成:

members['groupmass'][idx_matched_members] = groups['mass'][idx_matched_groups]

所以我需要一个快速例程来计算两个索引数组 idx_matched_membersidx_matched_groups。这种任务似乎很常见,以至于像 numpy 或 pandas 这样的包似乎很可能会有一个优化的解决方案。有谁知道专业开发的、自制的或其他方式的解决方案?

最佳答案

这可以通过 pandas 使用 map 将一列的数据映射到另一列的数据来完成。这是一个示例数据示例:

members = pandas.DataFrame({
    'id': np.arange(10),
    'groupID': np.arange(10) % 3,
    'groupmass': np.zeros(10)
})

groups = pandas.DataFrame({
    'groupID': np.arange(3),
    'mass': np.random.randint(1, 10, 3)
})

这为您提供了以下数据:

>>> members
   groupID  groupmass  id
0        0          0   0
1        1          0   1
2        2          0   2
3        0          0   3
4        1          0   4
5        2          0   5
6        0          0   6
7        1          0   7
8        2          0   8
9        0          0   9
>>> groups
   groupID  mass
0        0     3
1        1     7
2        2     4

然后:

>>> members['groupmass'] = members.groupID.map(groups.set_index('groupID').mass)
>>> members
   groupID  groupmass  id
0        0          3   0
1        1          7   1
2        2          4   2
3        0          3   3
4        1          7   4
5        2          4   5
6        0          3   6
7        1          7   7
8        2          4   8
9        0          3   9

如果你经常想使用 groupID 作为 groups 的索引,你可以永久设置它,这样你就不必每次都使用 set_index你这样做。

关于python - 快速 python 算法(在 numpy 或 pandas 中?)查找与另一个数组中的元素匹配的数组元素的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28130839/

相关文章:

performance - 为什么在 Haskell 的编译时不计算(常量)表达式?

mysql - 在数据库中的一组记录上存储排序顺序的最有效方法是什么?

c++ - 算法:计算单词列表频率的更好方法

algorithm - 如何计算此最长公共(public)前缀算法实现的运行时复杂度?

algorithm - 高效,正确和优化的算法来找到两条线之间的交点

python - kafka认证与授权

python - OperatorNotAllowedInGraphError : using a tf. 在图形执行中不允许将张量作为 Python bool

mysql - mysql查询中select语句中的计算速度慢

python - 查找拉丁语/希腊语词根 NLTK

python - einsum 和 matmul 之间的性能差异