我有2个numpy数组,我试图找到每个元素对的差异并将差异存储在矩阵中。
以下是我使用的代码:
for i in range(arr1):
for j in range(arr2):
data[i,j] = float(arr1[i])-float(arr2[j])
可以采取哪些措施来优化此循环的速度?
答案 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.
谢谢大家