脾气暴躁:通过任意长度的其他数组的唯一性来查找一个数组中的对应关系

时间:2018-07-27 06:33:33

标签: python arrays sorting numpy

我有一个问题,我有两个数组,其中一个带有可以多次出现的标识符,请说

import numpy as np
ind = np.random.randint(0,10,(100,))

,另一个长度相同,并且包含一些信息,在这种情况下为布尔值,对于ind标识的每个元素。它们会进行相应的排序。

dat = np.random.randint(0,2,(100,)).astype(np.bool8)

我正在寻找一种(更快的)方法来执行以下操作:对所有元素的每个元素(由ind定义)执行np.any()。如示例中,每个元素的出现次数是随机的。我现在正在做的是

result = np.empty(np.unique(ind))
for i,uni in enumerate(np.unique(ind)):
    result[i] = np.any(dat[ind==uni])

有点慢。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

方法1

ind索引dat,以选择需要检查的那些,用np.bincount获取合并计数,并查看哪些容器比发生的容器多-

result = np.bincount(ind[dat])>0

如果ind具有负数,则将其偏移min值-

ar = ind[dat]
result = np.bincount(ar-ar.min())>0

方法2

再加上np.unique-

unq = np.unique(ind[dat])
n = len(np.unique(ind))
result = np.zeros(n,dtype=bool)
result[unq] = 1

我们可以使用pandas来获取n

import pandas as pd
n = pd.Series(ind).nunique()

方法3

再加上indexing-

ar = ind[dat]
result = np.zeros(ar.max()+1,dtype=bool)
result[ar] = 1