【发布时间】:2013-06-16 22:38:12
【问题描述】:
我正在尝试在 numpy 中做一些简单的事情,我相信应该有一种简单的方法。
基本上,我有一个不同长度的n 向量列表。如果v1[i] 是第一个向量的i'th 条目,那么我想找到一个n 维数组A,这样
A[i,j,k...] = v1[i] v2[j] v3[k] ...
我的问题是:
outer只接受两个 vector 参数。einsum需要像“abcd...”这样的参数,这似乎是不必要的。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)
【问题讨论】:
-
直到运行时向量的数量是未知的?
-
@DarenW 是的,没错。
-
我喜欢这个
reduce(lambda a, b: a[..., np.newaxis] * b, vs),但我不确定这是否可以被视为“单个命令”。或者如果有更快的方法。 -
@jorgeca 不错。它绝对不会比我的方法慢。
-
你看过 itertools.combinations 吗?