用python和numpy创建三阶张量

用python和numpy创建三阶张量,python,arrays,numpy,matrix,Python,Arrays,Numpy,Matrix,我有两个一维数组,a这样np.shape(a)==(n,)和b这样np.shape(b)==(m,) 我想做一个(三阶)张量c,这样np.shape(c)==(n,n,m,)通过做c=np.outer(np.outer(a,a),b) 但当我这样做时,我得到: >> np.shape(c) (n*n,m) 这只是一个矩形矩阵。如何制作我想要的三维张量?您可以使用np.multiply.outer而不是np.outer来获得所需的外积: >>> a = n

我有两个一维数组,
a
这样
np.shape(a)==(n,)
b
这样
np.shape(b)==(m,)

我想做一个(三阶)张量
c
,这样
np.shape(c)==(n,n,m,)
通过做
c=np.outer(np.outer(a,a),b)

但当我这样做时,我得到:

>> np.shape(c) 

(n*n,m)   

这只是一个矩形矩阵。如何制作我想要的三维张量?

您可以使用
np.multiply.outer
而不是
np.outer
来获得所需的外积:

>>> a = np.arange(4)
>>> b = np.ones(5)
>>> mo = np.multiply.outer
然后我们有:

>>> mo(mo(a, a), b).shape
(4, 4, 5)
更好的方法是使用
np.einsum
(这样可以避免创建中间数组):


np.outer
按文档中所述展平输入。。。你可能正在搜索
np.kron
?你能举个例子说明你想要什么吗?因此,通过在ipython的实验,似乎
np.kron(b,np.kron(a,a))。重塑(m,n,n)
给出了我想要的,尽管索引是颠倒的。但这很干净,所以我想我会用这个。我喜欢这个比使用
np.kron
更好,因为它保留了形状信息。
>>> c = np.einsum('i,j,k->ijk', a, a, b)
>>> c.shape
(4, 4, 5)