鉴于两个numpy.array
s a
和b
,
c = numpy.outer(a, b)
返回c[i, j] == a[i] * b[j]
的二维数组。现在,假设a
具有k
维度。
c
的数组k+1
,其中c[..., j] == a * b[j]
?此外,让b
具有l
尺寸。
c
的数组k+1
,其中c[..., i1, i2, i3] == a * b[i1, i2, i3]
?答案 0 :(得分:5)
NumPy ufunc的outer
method以你想要的方式对待多维输入,所以你可以做到
numpy.multiply.outer(a, b)
而不是使用numpy.outer
。
此处提出的所有解决方案同样快速;对于小数组,multiply.outer
有一个轻微的边缘
生成图片的代码:
import numpy
import perfplot
def multiply_outer(data):
a, b = data
return numpy.multiply.outer(a, b)
def outer_reshape(data):
a, b = data
return numpy.outer(a, b).reshape((a.shape + b.shape))
def tensor_dot(data):
a, b = data
return numpy.tensordot(a, b, 0)
perfplot.show(
setup=lambda n: (numpy.random.rand(n, n), numpy.random.rand(n, n)),
kernels=[multiply_outer, outer_reshape, tensor_dot],
n_range=[2**k for k in range(7)],
logx=True,
logy=True,
)
答案 1 :(得分:2)
一种方法是使用np.outer
,然后使用reshape
-
np.outer(a,b).reshape((a.shape + b.shape))
答案 2 :(得分:2)
我认为np.tensordot
也有效
c = np.tensordot(a, b, 0)
inds = np.reshape(np.indices(b.shape), (b.ndim, -1))
for ind in inds.T:
ind = tuple(ind)
assert np.allclose(a * b[ind], c[(...,) + ind])
else:
print('no error')
# no error
答案 3 :(得分:1)
np.einsum正是您要找的。 p>
c[..., j] == a * b[j]
应该是
c = np.einsum('...i,j -> ...ij', a, b)
和c[..., i1, i2, i3] == a * b[i1, i2, i3]
应为
c = np.einsum('i,...jkl -> ...ijkl', a, b)
答案 4 :(得分:1)
我认为你正在寻找kroneker产品
例如
> np.kron(np.eye(2), np.ones((2,2)))
array([[ 1., 1., 0., 0.],
[ 1., 1., 0., 0.],
[ 0., 0., 1., 1.],
[ 0., 0., 1., 1.]])