简体   繁体   English

将二维和一维数组 NumPy 相乘

[英]Multiplying 2D and 1D arrays NumPy

I'm somewhat new to python and numpy, so maybe some of you can help me here.我对 python 和 numpy 有点陌生,所以也许你们中的一些人可以在这里帮助我。

I have a 1D numpy array called z, and some 2D matrices called X0 , Y0, and SLM.我有一个称为 z 的一维 numpy 数组,以及一些称为 X0 、 Y0 和 SLM 的二维矩阵。

I want to create a 3D array (a stack of 2D matrices), by doing this operation, trying to avoid a for loop:我想通过执行此操作来创建一个 3D 数组(一堆 2D 矩阵),试图避免 for 循环:

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

So far I've tried:到目前为止,我已经尝试过:

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

This performs right, but its slow for my purposes.这表现正确,但对我来说很慢。 The arrays are big (z is size 200, and all 2D matrices are 1024x1024)数组很大(z 大小为 200,所有 2D 矩阵都是 1024x1024)

Do you know any faster implementation for this?你知道任何更快的实现吗?

Good question, what you're looking for is np.tensordot , see example below:好问题,你要找的是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)

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

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