[英]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.