Iva*_*van 0 python numpy matplotlib
我还在挖掘python,而且我的C++背景有一些东西在阻碍.例如,我有一个班级
class crack(object):
def __init__(self, sz1,sz2):
self.z1 = sz1
self.z2 = sz2
def smallz_Z(self,z,z1,z2):
return z - 0.5*(z2-z1)
def get_pot(self,z):
Z = smallz_Z(z,self.z1,self.z2)
try:
result = np.sum(np.arange(self.n) * self.coeffs * (1.0 / (cmath.sqrt(Z - 1.0) * cmath.sqrt(Z + 1.0)))
* ((Z - cmath.sqrt(Z - 1.0) * cmath.sqrt(Z + 1.0)) ** np.arange(self.n))) * (2.0 / (self.z2 - self.z1))
Run Code Online (Sandbox Code Playgroud)
我要创建一个破解元素列表,
crack_list = []
crack_list.append(crack(z1,z2)) ...
Run Code Online (Sandbox Code Playgroud)
现在我需要使用迭代器来获取所有潜在的值,例如matplotlib轮廓函数.我做不到这样的事情:
result = np.sum(crack_list.get_potential(z))
Run Code Online (Sandbox Code Playgroud)
现在我正在做'传统'的方式:
def potential_value(z, crack_list):
potential = complex(0, 0)
for element in crack_list:
potential = potential + element.get_potential(z)
return potential
Run Code Online (Sandbox Code Playgroud)
如果我使用for循环,它表示元素破解是不可迭代的.让我们说我试着
x = np.linspace(self.x1, self.x2, self.step)
y = np.linspace(self.y1, self.y2, self.step)
X, Y = np.meshgrid(x, y)
Z = X +1j*Y
F = np.vectorize(potential_value)
Run Code Online (Sandbox Code Playgroud)
但在这里我有一个问题:
F(Z, crack_list)
for element in crack_list:
TypeError: 'crack' object is not iterable
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?谢谢.
编辑:谢谢你的答案.我仍然知道列表理解,所以它仍然在打我.假设我想改变列表理解的实现,所以我将函数更改为
def potential_value(z_list, crack_list, u_flow):
return [np.sum([c.get_potential(z) for c in crack_list]) + u_flow.get_potential_no_c(z) for z in z_list]
Run Code Online (Sandbox Code Playgroud)
我现在试图同时使用两个列表推导,所以潜在的将返回一个包含所有z_list变量的所有结果的数组 - 注意z_list应该是复杂类型的列表.有没有办法在z_list中只为一个复杂的值做到这一点,而不必传递只有一个值的列表?或者我必须做某种测试?
要迭代的对象需要有__iter__()方法,它返回一个迭代器(或序列).迭代器应该实现方法next(),它将产生元素或者raise StopIteration没有更多的元素.就如此容易.
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |