Numpy:n个向量的外积

Luc*_*cas 9 python arrays numpy

我正试图在numpy中做一些简单的事情,我确信应该有一个简单的方法.

基本上,我有一个n不同长度的矢量列表.如果v1[i]i第一个向量的第一个条目,那么我想找到一个n维数组A,这样

A[i,j,k...] = v1[i] v2[j] v3[k] ...
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. outer只需要两个向量参数.

  2. einsum 需要像"abcd ..."这样的参数,这似乎是不必要的.

  3. kron 需要看似相当复杂的重塑,并且只需要两个参数.

我想避免尽可能多的复杂性,以避免引入错误.所以我最好是一个命令.

到目前为止,我所掌握的最好的是:

 vs = [v1, v2, v3 ...]
 shape = map(len, vs)

 # specify the orientation of each vector
 newshapes = diag(array(shape)-1)+1
 reshaped = [x.reshape(y) for x,y in zip(vs, newshapes)]

 # direct product
 A = reduce(lambda a,b: a*b, reshaped, 1)
Run Code Online (Sandbox Code Playgroud)

HYR*_*YRY 8

您可以使用以下一行代码:

reduce(np.multiply, np.ix_(*vs))
Run Code Online (Sandbox Code Playgroud)

np.ix_()将做外部广播,你需要减少,但你可以传递np.multiply没有lambda函数的ufunc .

这是比较:

import numpy as np
vs = [np.r_[1,2,3.0],np.r_[4,5.0],np.r_[6,7,8.0]]
shape = map(len, vs)

 # specify the orientation of each vector
newshapes = np.diag(np.array(shape)-1)+1
reshaped = [x.reshape(y) for x,y in zip(vs, newshapes)]

# direct product
A = reduce(lambda a,b: a*b, reshaped, 1)
B = reduce(np.multiply, np.ix_(*vs))

np.all(A==B)
Run Code Online (Sandbox Code Playgroud)

重新:

True
Run Code Online (Sandbox Code Playgroud)

  • +1它可能是一个可以忽略不计的改进,除非你的矢量列表真的很长,但我认为numpy的`np.multiply.reduce(np-ix_(vs))`可能比Python构造更好. (5认同)