我有一个大的 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
