forloop+的矢量化版本纽比。什么

2024-03-29 04:55:41 发布

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

背景信息: 我有大量(N)的三维粒子,对于所有具有某些性质的粒子对,我计算了一个几何因子c[I,j]。然后我要求出固定I的所有对的贡献,称之为c[I](并对所有粒子I重复这个过程)。在

通常,相关对的数量要比N^2小得多,因此在位置[i,j]和其他位置有大量零的(N,N)维数组C相当快,但是在内存使用方面也非常低效。 所以现在我只存储了相关对的C[I,j]和在一维阵列中形成对的粒子。在

这可能最好用一个例子来说明: 比如说,我有两对粒子(3,5)和(3,10)。从示意图上看,我的变量如下所示(有意重复计算):

i = [3,3,5,10]  #list of particles i that form a pair
j = [5,10,3,3]  #corresponding particles j (not used in the later example) 
cij = [c35,c310,-c35,-c310] #(with actual numbers in reality)

现在可以归结为找到一种有效的矢量化方法来重写以下for循环:

^{pr2}$

我想到了其他解决方案,但希望避免:

a)并行化for循环:不可行的b/c这是嵌入到一个外部循环,我想在某个时候并行化。在

b)用C编写for循环,并将其包装成Python:对于这个(希望如此)相当简单的问题来说,这似乎是一个过火的问题。在


Tags: 内存in信息for数量过程粒子数组
1条回答
网友
1楼 · 发布于 2024-03-29 04:55:41

你可以用^{}得到你想要的东西。如果粒子从0开始按顺序编号,则只需执行以下操作:

ci = np.bincount(i, weights= cij)

要了解此操作的作用:

^{pr2}$

如果您不需要所有这些额外的零,可以执行以下操作:

>>> unq_i, inv_i = np.unique(i, return_inverse=True)
>>> unq_ci = np.bincount(inv_i, weights=cij)
>>> unq_i
array([ 3,  5, 10])
>>> unq_ci
array([ 0.3, -0.1, -0.2])

您可以稍后通过执行以下操作来分配这些唯一值:

ci[unq_i] = unq_ci

相关问题 更多 >