Python 3.x 将矩阵的每个元素与一个向量相乘,得到一个元素本身就是向量的矩阵
我需要帮助来加速以下代码块:Python 3.x 将矩阵的每个元素与一个向量相乘,得到一个元素本身就是向量的矩阵,python-3.x,numpy,Python 3.x,Numpy,我需要帮助来加速以下代码块: import numpy as np x = 100 pp = np.zeros((x, x)) M = np.ones((x,x)) arrayA = np.random.uniform(0,5,2000) arrayB = np.random.uniform(0,5,2000) for i in range(x): for j in range(x): y = np.mul
import numpy as np
x = 100
pp = np.zeros((x, x))
M = np.ones((x,x))
arrayA = np.random.uniform(0,5,2000)
arrayB = np.random.uniform(0,5,2000)
for i in range(x):
for j in range(x):
y = np.multiply(arrayA, np.exp(-1j*(M[j,i])*arrayB))
p = np.trapz(y, arrayB) # Numerical evaluation/integration y
pp[j,i] = abs(p**2)
numpy中是否有函数或其他方法重写这段代码,以便可以省略嵌套的for循环?我的想法是一个函数,将M的每个元素乘以向量arrayB,得到一个100 x 100的矩阵,其中每个元素本身就是一个向量。然后,进一步使用np.multiply()函数将每个向量与arrayA相乘,然后再次得到一个100 x 100的矩阵,其中每个元素本身就是一个向量。然后在最后使用np.trapz()对这些向量中的每一个进行数值积分,以获得一个100 x 100的矩阵,其中每个元素都是标量
但我的问题是,我缺乏执行这些功能的知识
提前感谢您的帮助
编辑:
利用广播
M = np.asarray(M)[..., None]
y = 1000*arrayA*np.exp(-1j*M*arrayB)
return np.trapz(y,B)
工作正常,我可以为循环编程。然而,这不是更快,而是在我的例子中稍微慢一点。这可能是内存问题
y = np.multiply(arrayA, np.exp(-1j*(M[j,i])*arrayB))
可以写成
y = arrayA * np.exp(-1j*M[:,:,None]*arrayB
生成(x,x,2000)数组
但下一步可能需要调整。我不熟悉np.trapz
np.trapz(y, arrayB)
您确定要
M=np.one((x,x))
?因为这让事情变得有点琐碎。(所有pp
都以相同的值结束)同样,是否应该对arrayB
进行排序?如果不是,我无法想象它的用途。M只是一个占位符矩阵,就像arrayA和arrayB一样。