根据第三个数组中每个匹配元素的另一个数组中的值对一个数组求和

2024-09-30 06:11:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个numpy数组,一个包含值,一个包含每个值类别。在

values=np.array([1,2,3,4,5,6,7,8,9,10])
valcats=np.array([101,301,201,201,102,302,302,202,102,301])

我有另一个数组,其中包含我想求和的唯一类别。在

^{pr2}$

我的问题是,我将运行同样的求和过程几十亿次,每微秒都很重要。在

我目前的实现如下。在

catsums=[]
for x in categories:
    catsums.append(np.sum(values[np.where(valcats==x)]))

产生的CATSUM应为:

[1, 14, 7, 8, 12, 13]

我当前的运行时间大约是5µs。我对Python还是个新手,希望通过结合前两个数组或lamdba或一些我甚至不知道的很酷的东西来找到一个快速的解决方案。在

谢谢你的阅读!在


Tags: innumpyfor过程np数组类别array
2条回答

@Divakar刚刚发布了一个非常好的答案。如果已经定义了类别数组,我将使用@Divakar的答案。如果你没有已经定义的唯一值,我会用我的。在


我将使用^{}来分解类别。然后使用^{},并将weights参数设置为values数组

f, u = pd.factorize(valcats)
np.bincount(f, values).astype(values.dtype)

array([ 1, 12,  7, 14, 13,  8])

pd.factorize还生成u变量中的唯一值。我们可以将结果与u对齐,以确定我们得到了正确的解决方案。在

^{pr2}$

您可以使用pd.Series使其更加明显

f, u = pd.factorize(valcats)
pd.Series(np.bincount(f, values).astype(values.dtype), u)

101     1
301    12
201     7
102    14
302    13
202     8
dtype: int64

为什么pd.factorize而不是np.unique

我们可以用

 u, f = np.unique(valcats, return_inverse=True)

但是,np.unique对值进行排序,并在nlogn时间内运行。另一方面,pd.factorize不排序,并且以线性时间运行。对于较大的数据集,pd.factorize将主导性能。在

您可以使用searchsortedbincount-

np.bincount(np.searchsorted(categories, valcats), values)

相关问题 更多 >

    热门问题