numpy数组操作方法

时间:2017-02-18 15:28:56

标签: python numpy vectorization

>>> c= array([[[1, 2],
               [3, 4]],

               [[2, 1],
                [4, 3]],

               [[3, 2],
                [1, 4]]])
 >>> x
 array([[0, 1, 2],
       [3, 4, 5]])

返回一个矩阵,使得每列是c中每个矩阵的乘积,乘以常规矩阵乘法中x的每个相应列。我试图找出一种方法来对其进行矢量化,或者至少不使用for循环来解决它。

array([[6,  6, 16]
       12, 16, 22]])

进一步扩展这个操作让我说我有一个矩阵数组,比如说

>>> c
    array([[[1, 2],
    [3, 4]],

   [[2, 1],
    [4, 3]],

   [[3, 2],
    [1, 4]]])  
>>> x
    array([[[1, 2, 3],
    [1, 2, 3]],

   [[1, 0, 2],
    [1, 0, 2]],

   [[2, 3, 1],
    [0, 1, 0]]])


def fun(c,x):
    for i in range(len(x)):
         np.einsum('ijk,ki->ji',c,x[i])
         ##something

所以基本上,我想让x中的每个矩阵与所有c相乘。返回类似于c的结构而不引入for for循环

我这样做的原因是因为我遇到了解决问题的问题,试图进行矢量化

Xc(操作遵循正常矩阵列向量乘法),c为3D数组;比如上面的c--一个列向量,每个元素都是一个矩阵(在numpy中它是上面的形式)。 X是矩阵,每个元素是一维数组。 Xc的输出应该是1D数组。

1 个答案:

答案 0 :(得分:1)

您可以使用np.einsum -

np.einsum('ijk,ki->ji',c,x)

示例运行 -

In [155]: c
Out[155]: 
array([[[1, 2],
        [3, 4]],

       [[2, 1],
        [4, 3]],

       [[3, 2],
        [1, 4]]])

In [156]: x
Out[156]: 
array([[0, 1, 2],
       [3, 4, 5]])

In [157]: np.einsum('ijk,ki->ji',c,x)
Out[157]: 
array([[ 6,  6, 16],
       [12, 16, 22]])

对于x的3D情况,只需将新维度附加到x的字符串表示法的开头,并相应地添加到输出字符串表示法,就像这样 -

np.einsum('ijk,lki->lji',c,x)

示例运行 -

In [151]: c
Out[151]: 
array([[[1, 2],
        [3, 4]],

       [[2, 1],
        [4, 3]],

       [[3, 2],
        [1, 4]]])

In [152]: x
Out[152]: 
array([[[1, 2, 3],
        [1, 2, 3]],

       [[1, 0, 2],
        [1, 0, 2]],

       [[2, 3, 1],
        [0, 1, 0]]])

In [153]: np.einsum('ijk,lki->lji',c,x)
Out[153]: 
array([[[ 3,  6, 15],
        [ 7, 14, 15]],

       [[ 3,  0, 10],
        [ 7,  0, 10]],

       [[ 2,  7,  3],
        [ 6, 15,  1]]])