Skip to main content
 首页 » 编程设计

python之Python中数组元素的迭代减法

2025年05月04日15Renyi-Fan

我有一个大的 numpy 数组。有没有办法用它下面的元素减去每个元素,并将结果存储在一个新的列表/数组中,而不使用循环。

我的意思的一个简单例子:

a = numpy.array([4,3,2,1]) 
 
result = [4-3, 4-2, 4-1, 3-2, 3-1, 2-1] = [1, 2, 3, 1, 2 ,1] 

请注意,我正在使用的“真实”数组不包含按顺序排列的数字。这只是为了简化示例。

我知道结果应该有(n-1)!元素,其中 n 是数组的大小。

有没有办法不使用循环,而是通过以“智能”方式重复数组来做到这一点?

谢谢!

请您参考如下方法:

temp = a[:, None] - a 
result = temp[np.triu_indices(len(a), k=1)] 

执行所有成对减法以产生temp,包括从自身中减去元素和从后面的元素中减去前面的元素,然后使用triu_indices 来选择我们想要的结果。 ( a[:, None] adds an extra length-1 axis to a .)

请注意,几乎所有的运行时间都花在从 temp 构造 result 上(因为 triu_indices 很慢并且使用索引来选择上三角数组的速度很慢)。如果可以直接使用temp,可以节省很多时间:

In [13]: a = numpy.arange(2000) 
 
In [14]: %%timeit 
   ....: temp = a[:, None] - a 
   ....:  
100 loops, best of 3: 6.99 ms per loop 
 
In [15]: %%timeit 
   ....: temp = a[:, None] - a 
   ....: result = temp[numpy.triu_indices(len(a), k=1)] 
   ....:  
10 loops, best of 3: 51.7 ms per loop