更快的方法来获得2个numpy数组的每个元素之间的差异

时间:2017-04-11 05:53:18

标签: python numpy

我有2个numpy数组,我试图找到每个元素对的差异并将差异存储在矩阵中。

以下是我使用的代码:

for i in range(arr1):
    for j in range(arr2):
        data[i,j] = float(arr1[i])-float(arr2[j])

可以采取哪些措施来优化此循环的速度?

2 个答案:

答案 0 :(得分:1)

正如评论中指出的,有几种方法可以达到目标。

In [1]: import numpy as np
In [6]: a = np.random.rand(1000)
In [7]: b = np.random.rand(1000)

In [9]: %timeit a - b.reshape((-1,1))
100 loops, best of 3: 2.46 ms per loop

In [10]: %timeit np.subtract.outer(a, b)
100 loops, best of 3: 2.52 ms per loop

似乎重塑和subtract.outer的速度相当。但是,您似乎需要转置结果才能使两种方法具有相同的结果

In [18]: a - b.reshape((-1,1)) == np.subtract.outer(a, b).T

array([[ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       ..., 
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True],
       [ True,  True,  True, ...,  True,  True,  True]], dtype=bool)

编辑 @PaulPanzer提出的第二种方法似乎是最慢的。

In [27]: %timeit np.subtract(*np.ix_(a, b)); a[:, None] - b[None, :]
100 loops, best of 3: 4.99 ms per loop

答案 1 :(得分:0)

np.subtract.outer(arr1, arr2) helped me solved the problem.

谢谢大家