获取两个numpy数组中每个元素之间差异的更快方法

3

我有两个numpy数组,希望找出每个元素对之间的差异并将其储存到矩阵中。

以下是我的代码:

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

如何优化此循环的速度?


1
你可以使用np.subtract.outer(arr1, arr2)或广播或np.subtract(*np.ix_(arr1, arr2))来进行编程;广播:arr1[:, None] - arr2[None, :] - Paul Panzer
1
类似以下代码:arr1 - arr2.reshape((-1,1)) - Julien
arr1_arr2_transformation = numpy.dstack(-arr1, arr2) 然后执行 numpy.sum(arr1_arr2_transformation) - FancyDolphin
为什么你不把你的答案发布为答案呢? - timgeb
不,除此之外,您在评论中提供的解决方案现在与您的第一条评论不同,它不起作用。 您可以通过查看形状来轻松验证它,该形状应为“(n,n)”。 在您的情况下,我得到的形状是“(1,n 2)”。 - greole
显示剩余3条评论
2个回答

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

似乎reshape和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

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

谢谢大家


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接