首页 > 解决方案 > 将矩阵的每个元素与一个向量相乘,得到一个其元素本身就是向量的矩阵

问题描述

我需要帮助来加快以下代码块的速度:

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) 

工作,我可以省略for循环。但是,这并不是更快,而是在我的情况下慢了一点。这可能是内存问题。

标签: python-3.xnumpy

解决方案


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)

推荐阅读