【问题标题】:Numpy "inner join" with repeating key带有重复键的 Numpy“内部连接”
【发布时间】:2019-02-18 06:59:19
【问题描述】:

我试图使用另一个数组中的“键”来查找数组中的值。不幸的是,由于键的“空间”太大(但稀疏),我无法将其转换为索引技巧(通过使用数组作为索引)。

我找到了“未记录”函数np.lib.recfunctions.join_by,它或多或少允许我通过“键”而不是索引来选择,这里是一个例子:

import numpy as np
from numpy.lib import recfunctions  # necessary!

>>> a = np.array([100,200,500,700,200,500,100,700,200], dtype=[('key','i')])
array([(100,), (200,), (500,), (700,), (200,), (500,), (100,), (700,),
       (200,)], dtype=[('key', '<i4')])

>>> b = np.array([(100,10),(200,20),(500,50),(700,70)], dtype=[('key','i'),('value','i')])
array([(100, 10), (200, 20), (500, 50), (700, 70)],
      dtype=[('key', '<i4'), ('value', '<i4')])

>>> np.lib.recfunctions.join_by('key', a, b, usemask=False)
array([(100,     10), (200,     20), (200, 999999), (500,     50),
       (500, 999999), (500, 999999), (700,     70), (700, 999999),
       (700, 999999)], dtype=[('key', '<i4'), ('value', '<i4')])

原来这个功能不支持重复“按键”。我想知道我怎样才能得到这样的结果

array([(100,10),(200,20),(500,50),(700,70),(200,20),(500,50),(100,10)...])

恰好遵循a的顺序,并有一个额外的查找结果列。任何帮助表示赞赏!

【问题讨论】:

    标签: python numpy inner-join record


    【解决方案1】:

    我发现我可以将所有可能的键重新映射到索引。对于上面的ab,假设b是排序的,我可以使用

    indexOfAInB = np.unique(np.r_[a['key'],b['key']], return_inverse=True)[1][:len(a)]
    

    获取映射。然后我可以使用索引技巧:

    B['value'][indexOfAInB]
    

    得到“查找结果”。

    由于np.unique 内部排序,我相信这将需要O(nlogn) 时间。不过,欢迎任何有关更好方法的建议!

    顺便说一句,这种方法不支持a中的key不在b

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-05
      • 2019-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-24
      • 1970-01-01
      • 2016-11-16
      相关资源
      最近更新 更多