numpy - 加速涉及数组切片和广播的numpy代码
问题描述
我有以下代码:
x = sp.linspace(-2,2,1000)
z = sp.linspace(-1,3,2000)
X,Z = sp.meshgrid(x,z)
X = X[:,:,sp.meshgrid]
Z = Z[:,:,sp.meshgrid]
E = sp.zeros((len(z),len(x),3), dtype=complex)
# e_uvect.shape = (2,N,2,3)
# En.shape = (2,N,2)
# d_cum.shape = (N,)
# pol is either 0 or 1
for n in range(N):
idx = sp.logical_and(Z<d_cum[n], Z>=d_cum[n-1])
E += e_uvect[pol,n,0,:]*En[pol,n,0]*sp.exp(+1j*self.kz[n]*(Z-d_cum[n-1])+1j*self.kx*X)*idx
N-
基本上以上是计算层结构电场的代码的一部分。对于循环内的每次迭代for
,我找到第 th 层内的数组元素的索引N
,然后在计算电场后,我将整个事物乘以idx
“过滤”出满足的正确部分sp.logical_and(Z<d_cum[n], Z>=d_cum[n-1])
。
它工作得很好,但我想知道是否有一种更有效的方法可以使用 numpy 数组切片或其他方法来执行此操作,因为每次乘法都涉及很大比例的数组元素,这些元素在每次迭代中都不被接受。我尝试了以下类似的方法,仅适用于坐标数组的相关部分Z
和X
idx = sp.logical_and(Z<d_cum[n], Z>=d_cum[n-1])
Z2 = Z[idx]
X2 = X[idx]
E[???] += e_uvect[pol,n,0,:]*En[pol,n,0]*sp.exp(+1j*self.kz[n]*(Z2-d_cum[n-1])+1j*self.kx*X2)
但是然后Z2
变成X2
一维数组,我不确定其中的索引部分E
或如何适当地重塑数组。
那么有什么方法可以加快原始代码的速度呢?
解决方案
推荐阅读
- python - Python多处理:如何关闭作为一系列动作的长时间运行的进程
- java - 拆分具有相似起始模式的字符串
- python - 在打印功能上不断出现语法错误?
- quickbooks - 将来自两个来源的数据导入到 Quickbooks 中的一家公司
- apache-kafka-connect - kafka-connect 错误:ORA-01882 找不到配置 docker 的时区
- java - 我的问题是输入:String s =“自学 java 编程”,输出是:“gninrael java gnimmargopr by fles?请帮助”
- c++ - 如何将模板类添加为普通类中的成员
- javascript - ASP.NET MVC 通过 AJAX 将 BeginCollectionItem 列表的对象与 Javascript 序列化到控制器传递 null
- prolog - 在prolog中列表的奇数元素之后插入一个元素
- python - 第 21 行的块标记无效:“交易”。您是否忘记注册或加载此标签?