【问题标题】:numpy array operation methodnumpy数组操作方法
【发布时间】:2017-02-19 09:03:05
【问题描述】:
>>> 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 相乘。在不引入这个for循环的情况下返回类似于c的结构

我这样做的原因是因为我遇到了一个问题来解决一个问题,试图向量化

Xc(运算遵循法线矩阵列向量乘法),c为3D数组;就像上面的 c - 一个列向量,每个元素都是一个矩阵(在 numpy 中它的形式在上面)。 X 是矩阵,每个元素都是一维数组。 Xc 的输出应该是一维数组。

【问题讨论】:

  • 那么,预期的输出也是3D?
  • @Divakar 是的,对于 fun(c,x) 它应该是 3D 数组;

标签: python numpy vectorization


【解决方案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]]])

【讨论】:

  • 我多次尝试操作 ijk;我做不到这一点。如果x也是一个矩阵数组,则返回一个矩阵数组,这样每个矩阵都按照上面的方式生成?
  • @ElleryL 不确定您所说的“矩阵数组”是什么意思。能发个样本吗?
  • 我已经编辑了原始问题;不知道我解释得好不好
  • 哦,对了,我应该引入一个新的下标;非常感谢您的帮助和快速回复
  • 顺便说一句,想知道这是否是 numpy 中的一种张量点实现?
猜你喜欢
  • 2016-06-06
  • 2018-11-30
  • 2016-09-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-21
  • 2018-07-25
  • 1970-01-01
相关资源
最近更新 更多