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)
这本质上是沿着两个输入数组dot-product
执行归约。axis=1
尺寸可以这样表示 -
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
即可得到所需的输出。让我们展示一下 -
arr_in : n [3] 1 \nmatrices : n [3] 3\n
Run Code Online (Sandbox Code Playgroud)\n\n现在,这可以通过两种方式实现。
\n\n1) 与np.einsum
-
np.einsum(\'ij,ijk->ik\',arr_in,matrices)\n
Run Code Online (Sandbox Code Playgroud)\n\n2) 与NumPy broadcasting
-
(arr_in[...,None]*matrices).sum(1)\n
Run Code Online (Sandbox Code Playgroud)\n\n运行时测试并验证输出(针对einsum
版本)-
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
归档时间: |
|
查看次数: |
1309 次 |
最近记录: |