Python 具有复数的 lambda
Python lambda with complex number
基于一些调试,我断章取义了以下片段。
我有一个名为 'part' 的 lambda 函数,它取决于变量 theta 和 phi。如果您循环浏览 returned lambda 函数列表(d4[0]、d4[1] 等),您会发现它们都是 return 一个虚数部分为 0 的复数,无论我赋予函数的 theta,phi 值如何。这是不正确的。对于大多数 theta、phi 参数,这些函数中的大多数应该 return 具有非零虚部的复数。知道为什么会这样吗?
import numpy as N
xarr,yarr,zarr = N.meshgrid(N.linspace(-0.5,0.5,32),N.linspace(-1.0,1.0,64),N.linspace(-0.0,0.0,1))
xnum,ynum,znum = xarr.shape
#d1,d2,d3,d4 are for debugging
d1,d2,d3,d4 = [],[],[],[]
for i in range(xnum):
for j in range(ynum):
for k in range(znum):
x,y,z = N.float64(xarr[i,j,k]),N.float64(yarr[i,j,k]),N.float64(zarr[i,j,k])
d1.append(x),d2.append(y),d3.append(z)
part = lambda theta,phi: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))
d4.append(part)
您需要在创建lambda 时捕获循环变量的当前值。否则,该函数将在调用时读取其创建范围内的那些变量的值。
可以通过参数默认值来完成:
part = lambda theta,phi, x=x, y=y, z=z, k=k: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))
基于一些调试,我断章取义了以下片段。
我有一个名为 'part' 的 lambda 函数,它取决于变量 theta 和 phi。如果您循环浏览 returned lambda 函数列表(d4[0]、d4[1] 等),您会发现它们都是 return 一个虚数部分为 0 的复数,无论我赋予函数的 theta,phi 值如何。这是不正确的。对于大多数 theta、phi 参数,这些函数中的大多数应该 return 具有非零虚部的复数。知道为什么会这样吗?
import numpy as N
xarr,yarr,zarr = N.meshgrid(N.linspace(-0.5,0.5,32),N.linspace(-1.0,1.0,64),N.linspace(-0.0,0.0,1))
xnum,ynum,znum = xarr.shape
#d1,d2,d3,d4 are for debugging
d1,d2,d3,d4 = [],[],[],[]
for i in range(xnum):
for j in range(ynum):
for k in range(znum):
x,y,z = N.float64(xarr[i,j,k]),N.float64(yarr[i,j,k]),N.float64(zarr[i,j,k])
d1.append(x),d2.append(y),d3.append(z)
part = lambda theta,phi: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))
d4.append(part)
您需要在创建lambda 时捕获循环变量的当前值。否则,该函数将在调用时读取其创建范围内的那些变量的值。
可以通过参数默认值来完成:
part = lambda theta,phi, x=x, y=y, z=z, k=k: (N.cos(theta)**(0.5))*N.sin(theta)*N.exp(-1j*k*(x*N.sin(theta)*N.cos(phi) + y*N.sin(theta)*N.sin(phi) - z*N.cos(theta)))