当前位置: 首页 > 面试题库 >

匹配两个2D数组的行并使用numpy获取行索引图

邵刚洁
2023-03-14
问题内容

假设您有两个2D数组A和B,并且要检查B中包含A行的位置。如何使用numpy最有效地做到这一点?

例如

a = np.array([[1,2,3],
              [4,5,6],
              [9,10,11]])

b = np.array([[4,5,6],
              [4,3,2],
              [1,2,3],
              [4,8,9]])
map = [[0,2], [1,0]]  # row 0 of a is at row index 2 of array B

我知道如何使用in1d(检查2d
numpy数组中的成员资格
)检查A的行是否在B中,但这不会产生索引图。

该映射的目的是(最终)基于某些列将两个数组合并在一起。
当然,可以逐行执行此操作,但这效率非常低,因为我的数组具有形状(50 Mio.,20)。

一种替代方法是使用pandas merge函数,但我只想使用numpy做到这一点。


问题答案:

方法1

这是基于的一个views。利用np.argwhere(docs)返回满足条件的元素索引,在这种情况下为成员资格。--

def view1D(a, b): # a, b are arrays
    a = np.ascontiguousarray(a)
    b = np.ascontiguousarray(b)
    void_dt = np.dtype((np.void, a.dtype.itemsize * a.shape[1]))
    return a.view(void_dt).ravel(),  b.view(void_dt).ravel()

def argwhere_nd(a,b):
    A,B = view1D(a,b)
    return np.argwhere(A[:,None] == B)

方法#2

这是另一种O(n)性能,因此会更好,尤其是在大型阵列上-

def argwhere_nd_searchsorted(a,b):
    A,B = view1D(a,b)
    sidxB = B.argsort()
    mask = np.isin(A,B)
    cm = A[mask]
    idx0 = np.flatnonzero(mask)
    idx1 = sidxB[np.searchsorted(B,cm, sorter=sidxB)]
    return idx0, idx1 # idx0 : indices in A, idx1 : indices in B

方法#3

另一个O(n)使用argsort()-

def argwhere_nd_argsort(a,b):
    A,B = view1D(a,b)
    c = np.r_[A,B]
    idx = np.argsort(c,kind='mergesort')
    cs = c[idx]
    m0 = cs[:-1] == cs[1:]
    return idx[:-1][m0],idx[1:][m0]-len(A)

样本使用与之前相同的输入运行-

In [650]: argwhere_nd_searchsorted(a,b)
Out[650]: (array([0, 1]), array([2, 0]))

In [651]: argwhere_nd_argsort(a,b)
Out[651]: (array([0, 1]), array([2, 0]))


 类似资料:
  • 问题内容: 我对python和numpy很陌生。请问有人可以帮助我了解如何对用作索引的某些数组进行索引。我有以下六个2D阵列- 我想将这些数组用作索引,并将值10放入新的空矩阵的相应索引中。输出应如下所示: 到目前为止,我已经尝试过 但这给了我错误的输出。任何帮助请。 问题答案: 工作原理: 如果您在工作分配中使用 两个 numpy数组建立索引, 然后认为NumPy的作为过的各元件同时移动和中的每

  • 问题内容: 我有一个奇怪的情况。 我有一个2D Numpy数组,x: 我有2个索引器-一个索引为行,一个索引为列。为了索引X,我必须执行以下操作: 不仅仅是: (失败:错误,无法通过(2,)广播(20,)) 我希望能够使用广播在一行中建立索引,因为这样可以使代码保持干净和可读性…而且,我对幕后的python并不太了解,但是据我了解它,它在一行中应该更快(我将使用相当大的数组)。 测试用例: 问题答

  • 问题内容: 我要寻找一个量化的方式来索引的索引。 例如: 我想建立一个新的数组,以便该数组中的每一行(i)都是array的row(i),并由数组inds(i)的行索引。我想要的输出是: 我可以通过循环来实现: 但我正在寻找一种纯矢量化的解决方案。 问题答案: 使用索引数组对另一个数组进行索引时,每个索引数组的形状应与 输出 数组的形状匹配。您希望列索引匹配,并且您希望行索引匹配输出的行,例如: 由

  • 问题内容: 我是numpy的新手,并且正在python中使用随机森林实现集群。我的问题是: 如何找到数组中确切行的索引?例如 我寻找并得到结果1(第二行的索引)。 有什么建议吗?遵循代码(不起作用…) 问题答案: 为什么不简单地做这样的事情?

  • 问题内容: 我有一个非常大的2D数组,看起来像这样: 使用numpy,是否有一种简单的方法来获得一个新的2D数组,例如从初始数组中获得2个随机行(无需替换)? 例如 问题答案: 一般情况下将其放在一起: 对于非替换(numpy 1.7.0+): 我不认为有一种很好的方法可以在不替换1.7之前生成随机列表。也许您可以设置一个小的定义,以确保两个值不相同。

  • 给定一个具有“boolcol”列的数据frame,我们希望找到其中“boolcol”的值==True的数据frame的索引 我目前有一种迭代的方法来完成它,它非常有效: