python 中的矩阵直积保留指数

Matrix direct product retaining indices in python

我是一名新手程序员,开始在 python 中编写代码。我有两个 2D numpy 数组,我想按以下方式组合它们以形成一个 4D numpy 数组,
array_4d[i, j, k, l] = array_1[i, j] * array_2[k, l]
我当然可以通过编写嵌套的 for 循环来强行执行此操作,但我想知道是否有更有效的方法来执行此操作以及是否已在某些包中预定义了此操作。谢谢

你看过np.einsum了吗?它可以让你非常优雅地写下来:

>>> import numpy as np
>>> a = np.random.random_integers(0,9, (2,2))
>>> b = np.random.random_integers(0,9, (3,3))
>>> c = np.einsum('ij,kl-> ijkl', a, b)
>>> a
array([[4, 5],
       [8, 0]])
>>> b
array([[6, 8, 4],
       [8, 5, 5],
       [8, 9, 8]])
>>> c
array([[[[24, 32, 16],
         [32, 20, 20],
         [32, 36, 32]],

        [[30, 40, 20],
         [40, 25, 25],
         [40, 45, 40]]],


       [[[48, 64, 32],
         [64, 40, 40],
         [64, 72, 64]],

        [[ 0,  0,  0],
         [ 0,  0,  0],
         [ 0,  0,  0]]]])

循环将在 C 中,所以速度很快。

这个特定的产品也可以通过 numpy 的广播轻松制作:

>>> c2 = a[...,np.newaxis, np.newaxis]*b
>>> np.any(c2-c)
False  # indicates that both approaches result in the same ndarray

事实证明后一种方法更快,但请注意计时结果通常取决于输入数组:

In [61]: a = np.random.random_integers(0,9, (20,30))

In [62]: b = np.random.random_integers(0,9, (300,500))

In [63]: %timeit c2 = a[...,np.newaxis, np.newaxis]*b
1 loops, best of 3: 250 ms per loop

In [64]: %timeit c = np.einsum('ij,kl-> ijkl', a, b)
1 loops, best of 3: 342 ms per loop