基本上,s_{i,j} = a_i + b_j
如果 n=len(a)
和 m=len(b)
,那么 s.shape
是 (n,m)
。因此,上述加法不是交换的。
它涉及一些戏法:
s = np.tile(a.reshape(n,1),m).reshape(n,m) + np.tile(b,n).reshape(n,m)
但我想知道numpy中是否已经有了这种方法。我找不到它。
基本上,s_{i,j} = a_i + b_j
如果 n=len(a)
和 m=len(b)
,那么 s.shape
是 (n,m)
。因此,上述加法不是交换的。
它涉及一些戏法:
s = np.tile(a.reshape(n,1),m).reshape(n,m) + np.tile(b,n).reshape(n,m)
但我想知道numpy中是否已经有了这种方法。我找不到它。
是的,确实有这样的方法。 numpy
的 ufuncs 有一个名为 outer
的方法:
s = np.add.outer(a, b)
外部或广播?
在我的测试中,广播更好。
v1 = np.random.random((1_000))
v2 = np.random.random((1_000))
%timeit np.add.outer(v1, v2)
%timeit v1[:, np.newaxis] + v2
# 9.81 µs ± 2.08 µs per loop (mean ± std. dev. of 7 runs, 100000 loops each)
# 7.95 µs ± 756 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each
这两段代码几乎相同,但是v1[:, np.newaxis] + v2
可能会更快(?)
from numba import jit
@jit(nopython=True)
def f1(v1, v2): # throw error
return np.add.outer(v1, v2)
def f2(v1, v2): # works
return v1[:, np.newaxis] + v2
v1[:, np.newaxis] + v2
是 Numba 兼容的。
v1[:, np.newaxis] + v2
等同于 v1[:, None] + v2
。
a[:,np.newaxis] + b
来利用广播
。 - Divakar