繁体   English   中英

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM