有没有一个numpy方法可以通过将两个1D数组相加来创建一个2D数组?

3

基本上,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中是否已经有了这种方法。我找不到它。


2
使用 a[:,np.newaxis] + b 来利用 广播 - Divakar
2个回答

5

是的,确实有这样的方法。 numpy 的 ufuncs 有一个名为 outer 的方法:

s = np.add.outer(a, b)

0

外部或广播?

简而言之

在我的测试中,广播更好。

速度

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可能会更快(?)

Numba

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


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