我有一个问题,我有两个数组,其中一个带有可以多次出现的标识符,请说
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])
有点慢。有什么想法吗?
答案 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