有效地计算数组元素的所有成对组合的度量

2024-04-19 18:42:43 发布

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

我有下面的代码,其中我计算数组元素的平均差,每个元素之间的平均差。有没有比嵌套循环(比如numpy函数)更有效的方法?你知道吗

import numpy as np

a = np.array([0.02625, -0.04125, -0.00875, -0.05625, 0.04375, 0.03625])

delta = []
for i in range(len(a) - 1):
  for j in range(i+1, len(a)):
    delta.append(a[i] - a[j])    
delta = np.array(delta)

avg_dist = np.sum(np.abs(delta)) / delta.size

Tags: 方法函数代码innumpy元素forlen
1条回答
网友
1楼 · 发布于 2024-04-19 18:42:43

进近#1

^{}/^{}获得成对索引,使用这些索引到输入数组中,从而计算差异-

I,J = np.triu_indices(len(a),1)
delta = a[I] - a[J]

进近#2

我们还可以使用slicing和一个循环,这应该是内存效率,因为它避免生成索引,就像在前面的方法中所做的那样-

def pairwise_diff(a):
    n = len(a)
    N = n*(n-1)//2
    idx = np.concatenate(( [0], np.arange(n-1,0,-1).cumsum() ))
    start, stop = idx[:-1], idx[1:]
    out = np.empty(N,dtype=a.dtype)
    for j,i in enumerate(range(n-1)):
        out[start[j]:stop[j]] = a[i,None] - a[i+1:]
    return out

具有10000元素的大型数组上的计时-

In [214]: a = np.random.rand(10000)

# Approach #1
In [215]: %%timeit
     ...: I,J = np.triu_indices(len(a),1)
     ...: delta = a[I] - a[J]
1 loop, best of 3: 627 ms per loop

# Approach #2
In [216]: %timeit pairwise_diff(a)
10 loops, best of 3: 69.1 ms per loop

# Original approach
In [217]: %%timeit
     ...: delta = []
     ...: for i in range(len(a) - 1):
     ...:   for j in range(i+1, len(a)):
     ...:     delta.append(a[i] - a[j])
1 loop, best of 3: 15.7 s per loop

相关问题 更多 >