将向量数组与矩阵数组相乘;返回向量数组?

Hen*_*ese 5 python arrays numpy matrix

我有一个numpy形状为 (n,3) 的行向量数组和另一个形状为 (n,3,3) 的矩阵 numpy 数组。我想将 n 个向量中的每一个与相应的矩阵相乘,并返回结果向量的形状 (n,3) 的数组。

到目前为止,我已经使用 for 循环来迭代 n 个向量/矩阵并逐项进行乘法。

我想知道是否有一种更麻木的方式来做到这一点。一种没有 for 循环甚至可能更快的方法。

//编辑1:

根据要求,这是我的循环代码(带有n = 10):

    arr_in = np.random.randn(10, 3)
    matrices = np.random.randn(10, 3, 3)

    for i in range(arr_in.shape[0]): # 10 iterations
        arr_out[i] = np.asarray(np.dot(arr_in[i], matrices[i]))
Run Code Online (Sandbox Code Playgroud)

Div*_*kar 2

这本质上是沿着两个输入数组dot-product执行归约。axis=1尺寸可以这样表示 -

\n\n
arr_in   :     n   3 \nmatrices : n   3   3\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,解决该问题的一种方法是将 的维度“推”arr_in到前面 1 ,从而在其 3D 数组版本中axis/dimension创建单个维度 at 。axis=2然后,对元素进行求和axis = 1即可得到所需的输出。让我们展示一下 -

\n\n
arr_in   : n   [3]   1 \nmatrices : n   [3]   3\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,这可以通过两种方式实现。

\n\n

1) 与np.einsum-

\n\n
np.einsum(\'ij,ijk->ik\',arr_in,matrices)\n
Run Code Online (Sandbox Code Playgroud)\n\n

2) 与NumPy broadcasting-

\n\n
(arr_in[...,None]*matrices).sum(1)\n
Run Code Online (Sandbox Code Playgroud)\n\n

运行时测试并验证输出(针对einsum版本)-

\n\n
In [329]: def loop_based(arr_in,matrices):\n     ...:     arr_out = np.zeros((arr_in.shape[0], 3))\n     ...:     for i in range(arr_in.shape[0]):\n     ...:         arr_out[i] =  np.dot(arr_in[i], matrices[i])\n     ...:     return arr_out\n     ...: \n     ...: def einsum_based(arr_in,matrices):\n     ...:     return np.einsum(\'ij,ijk->ik\',arr_in,matrices)\n     ...: \n\nIn [330]: # Inputs\n     ...: N = 16935\n     ...: arr_in = np.random.randn(N, 3)\n     ...: matrices = np.random.randn(N, 3, 3)\n     ...: \n\nIn [331]: np.allclose(einsum_based(arr_in,matrices),loop_based(arr_in,matrices))\nOut[331]: True\n\nIn [332]: %timeit loop_based(arr_in,matrices)\n10 loops, best of 3: 49.1 ms per loop\n\nIn [333]: %timeit einsum_based(arr_in,matrices)\n1000 loops, best of 3: 714 \xc2\xb5s per loop\n
Run Code Online (Sandbox Code Playgroud)\n