python-3.x - 将矩阵的每个元素与一个向量相乘,得到一个其元素本身就是向量的矩阵
问题描述
我需要帮助来加快以下代码块的速度:
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循环。但是,这并不是更快,而是在我的情况下慢了一点。这可能是内存问题。
解决方案
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)
推荐阅读
- python-3.x - signalR in python, then RecursionError
- filter - 使用 RediSearch 过滤 ID
- c++ - C++17文件路径分解成文件夹名
- java - 我们如何将 java 对象传递给 groovyx.net.http.RestClient 的 POST 调用
- java - Replacing elements in array by the larger of its neighbour
- numbers - How do I compare non integer numbers using freemarker templete
- sql - Excel doesn't save SQL query changes
- c++ - 使用声明和实例化中的默认模板参数
- javascript - Reaction CALL_AND_RETRY_LAST
- java - How to extract data from Json array?