将2D和1D数组相乘NumPy

时间:2020-10-14 13:28:38

标签: python arrays performance numpy product

我是python和numpy的新手,所以也许有些人可以在这里帮助我。

我有一个称为z的一维numpy数组,以及一些名为X0,Y0和SLM的2D矩阵。

我想通过执行以下操作来创建3D数组(2D矩阵的堆栈),尝试避免for循环:

for index in range(len(z)):
    3D_array[index] = SLM * np.exp( z[index] * (X0+Y0) )

到目前为止,我已经尝试过:

3D_array = SLM[np.newaxis, :] * np.exp( z[:, np.newaxis, np.newaxis] * (X0+Y0))

这执行得不错,但是就我的目的而言它很慢。 数组很大(z的大小为200,所有2D矩阵均为1024x1024)

您知道更快的实现方法吗?

2 个答案:

答案 0 :(得分:0)

好问题,您要寻找的是np.tensordot,请参见下面的示例:

import numpy as np

x0 = np.floor(np.random.rand(3, 3)*10)
y0 = np.floor(np.random.rand(3, 3)*10)

z = np.array([1, 2, 3])

SLM = 1

array = SLM*np.exp(np.tensordot(z, x0+y0, axes=0))

答案 1 :(得分:0)

# Assuming SLM contains only positive values this is the fastest way 
%timeit np.log(slm[np.newaxis, :, :] + 1e-9) + z[:, np.newaxis, np.newaxis] * (x + y )
1.67 s ± 11 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

 %timeit slm[np.newaxis, :, :] * np.exp(z[:, np.newaxis, np.newaxis] * (x + y ))
4.15 s ± 689 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

%timeit slm[np.newaxis, :, :] * np.exp(np.tensordot(z, x + y, axes=0))
3.9 s ± 43.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)