2D和1D阵列的乘积NumPy



我对python和numpy有些陌生,所以也许你们中的一些人可以在这里帮助我。

我有一个叫做z的1D 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(

你知道有什么更快的实现吗?

好问题,您要查找的是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))
# 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)

最新更新