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一样。