方法1

用^{}得到成对索引,用这些索引到a的行中,并计算差异-In [8]: r,c = np.triu_indices(len(a),1)

In [9]: a[c] - a[r]

Out[9]:

array([[3, 3, 3],

[6, 6, 6],

[3, 3, 3]])

方法2

我们还可以使用切片来避免创建索引,而索引部分本身则为减法所需的切片创建输入数组的副本。因此,我们只处理视图,但需要在该过程中迭代。对于大型阵列,切片的优势在性能上显示得淋漓尽致,我们稍后将在计时中进行验证。实施将是-

^{pr2}$

运行时测试

作为函数的方法-def pairwise_row_diff_triu_indices(a):

r,c = np.triu_indices(len(a),1)

out = a[c] - a[r]

return out

def pairwise_row_diff_slicing(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,a.shape[1]),dtype=a.dtype)

for j,i in enumerate(range(n-1)):

out[start[j]:stop[j]] = a[i+1:] - a[i,None]

return out

时间安排-In [53]: np.random.seed(0)

In [54]: a = np.random.randint(0,9,(1000,3))

In [55]: %timeit pairwise_row_diff_triu_indices(a)

...: %timeit pairwise_row_diff_slicing(a)

10 loops, best of 3: 21 ms per loop

100 loops, best of 3: 6.01 ms per loop

In [56]: a = np.random.randint(0,9,(5000,3))

In [57]: %timeit pairwise_row_diff_triu_indices(a)

...: %timeit pairwise_row_diff_slicing(a)

1 loop, best of 3: 456 ms per loop

10 loops, best of 3: 110 ms per loop

Logo

GitCode 天启AI是一款由 GitCode 团队打造的智能助手,基于先进的LLM(大语言模型)与多智能体 Agent 技术构建,致力于为用户提供高效、智能、多模态的创作与开发支持。它不仅支持自然语言对话,还具备处理文件、生成 PPT、撰写分析报告、开发 Web 应用等多项能力,真正做到“一句话,让 Al帮你完成复杂任务”。

更多推荐