我是python的新手,并通过Python“科学讲义发布2013.1”教程学习。请帮助我在下面的srcreenshot中解决这个Mandelbrot问题(第71页)。如果可能的话,请提供逐步命令和说明,因为编程概念对我来说是新的。
http://dl.dropbox.com/u/50511173/mandelbrot.png
我试着按如下方式解决这个问题:
import numpy as np
import matplotlib.pyplot as plt
x,y=np.ogrid[-2:1:10j,-1.5:1.5:10j]
c=x + 1j*y
z=0
for g in range(50):
z=z**2 + c
plt.imshow(z.T, extent=[-2,1,-1.5,1.5])
我遇到以下错误“TypeError:图片数据无法转换为浮动”
这个错误究竟意味着什么以及如何纠正它?我发现很难理解imshow()函数。 imshow()中的个别术语是什么意思?
谢谢。
答案 0 :(得分:5)
Mandelbrot集合不是您试图绘制的z
的值,这会给您带来问题,因为它们是复数。 Mandelbrot集由复平面的点p
组成,其中递归关系z_n = z_n-1**2 + p
仍然有界。通过将几次迭代后的结果与某个阈值进行比较,以实际方式检查。在您的情况下,如果您在for
循环后添加以下行:
threshold = 2
mask = np.abs(z) < threshold
然后绘制mask
你应该在屏幕上看到设定的情节。
要理解imshow
论点的一般运作方式,最好先阅读docs而不是在这里询问。
答案 1 :(得分:5)
感谢@Jan和@Jaime。我得到它如下工作,虽然花费了太多时间来计算:
import numpy as np
import scipy as sp
import matplotlib.pyplot as plt
x,y=np.ogrid[-2:1:5000j,-1.5:1.5:5000j]
print('')
print('Grid set')
print('')
c=x + 1j*y
z=0
for g in range(500):
print('Iteration number: ',g)
z=z**2 + c
threshold = 2
mask=np.abs(z) < threshold
print('')
print('Plotting using imshow()')
plt.imshow(mask.T,extent=[-2,1,-1.5,1.5])
print('')
print('plotting done')
print('')
plt.gray()
print('')
print('Preparing to render')
print('')
plt.show()
答案 2 :(得分:2)
您收到此错误,因为plt.imshow
不接受复数数组。您可以将数组Z
的实部或虚部表示为Z.real
或Z.imag
。因此,如果你想绘制真实的部分
plt.imshow(z.real.T, extent=[-2,1,-1.5,1.5])
可以胜任。
'imshow'中的参数定义了以下内容。
如果z
是N-by-M矩阵,则将其解释为常规网格上的点值。通过extent
,您可以指定此网格在空间中的扩展方式......
答案 3 :(得分:2)
您尝试使用imshow绘制复杂值,这就是您收到该错误的原因,可以像其他人建议的那样使用阈值,但您可能需要考虑使用np.angle
或{{1}也是。您还可以使用Python的内置np.abs
方法简化z的计算。
这个有一些乐趣,但这显示了一般的想法:
reduce