数组之间的交集指标

时间:2019-02-07 20:02:11

标签: python numpy

有没有一种快速的方法可以将数组的每个元素与唯一标识符列表中的每个元素进行比较?

使用for循环遍历每个唯一值都可以,但是太慢而无法使用。我一直在寻找矢量化解决方案,但没有成功。任何帮助将不胜感激!

Thread.sleep(5000);

示例输入:

arrStart = []
startRavel = startInforce['pol_id'].ravel()
for policy in unique_policies:
    arrStart.append(np.argwhere(startRavel == policy))

示例输出:

startRavel = [1,2,2,2,3,3]

unique_policies = [1,2,3]

新数组的长度与唯一值数组的长度相同,但是每个元素都是与大数组中的唯一值匹配的所有行的列表。

1 个答案:

答案 0 :(得分:4)

这是向量化的解决方案:

import numpy as np
startRavel = np.array([1,2,2,2,3,3])
unique_policies = np.array([1,2,3])

使用np.argsortstartRavel进行排序。

ix = np.argsort(startRavel)
s_startRavel = startRavel[ix]

使用np.searchsorted查找应在unique_policies中插入startRavel以保持顺序的索引:

s_ix = np.searchsorted(s_startRavel, unique_policies)
# array([0, 1, 4])

然后使用np.split使用获得的索引来拆分数组。 np.argsorts_ix上再次用于处理未排序的输入:

ix_r = np.argsort(s_ix)
ixs = np.split(ix, s_ix[ix_r][1:])
np.array(ixs)[ix_r]
# [array([0]), array([1, 2, 3]), array([4, 5])]

通用解决方案

让我们将其全部包装在一个函数中:

def ix_intersection(x, y):
    """
    Finds the indices where each unique
    value in x is found in y.
    Both x and y must be numpy arrays.
    ----------
    x: np.array
       Must contain unique values. 
       Values in x are assumed to be in y.
    y: np.array

    Returns
    -------
    Array of arrays. Each array contains the indices where a
    value in x is found in y
    """
    ix_y = np.argsort(y)
    s = np.searchsorted(y[ix_y], x)
    ix_r = np.argsort(s)
    ixs = np.split(ix_y, s[ix_r][1:])
    return np.array(ixs)[ix_r]

其他示例

让我们尝试以下数组:

startRavel = np.array([1,3,3,2,2,2])
unique_policies = np.array([1,2,3])

ix_intersection(unique_policies, startRavel)
# array([array([0]), array([3, 4, 5]), array([1, 2])])

另一个例子,这次输入未排序:

startRavel = np.array([1,3,3,2,2,2,5])
unique_policies = np.array([1,2,5,3])

ix_intersection(unique_policies, startRavel)
# array([array([0]), array([3, 4, 5]), array([6]), array([1, 2])])