用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)