2013-02-22 93 views
8

我是新来的Python和学习Python的“科学讲义笔记Release 2013.1”教程。请在下面的srcreenshot中帮助我解决这个Mandelbrot问题(Pg 71)。如果可能的话,请提供步骤明确的命令和解释,因为编程概念对我来说是新的。用matplotlib绘制Mandelbrot/pyplot/numpy/python

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]) 

我遇到了以下错误“类型错误:图像数据无法转换为浮动”

这个错误是什么恰恰意味着以及如何纠正它?我发现很难理解imshow()函数。 imshow()中的单个术语是什么意思?

谢谢。

回答

5

Mandelbrot集不是你试图绘制的z的值,它们给你的问题是因为它们是复数。 Mandelbrot集合由重复关系z_n = z_n-1**2 + p保持有界的复平面的点p组成。通过将几次迭代后的结果与某个阈值进行比较,以实际的方式检查了这一点。在你的情况,如果你的for循环后添加以下行:

threshold = 2 
mask = np.abs(z) < threshold 

,然后绘制mask你应该看到屏幕上的情节设置。

要理解imshow的论点的一般工作,你会比在这里询问docs更好。

2

您会收到此错误,因为plt.imshow不接受复数数组。你可以将数组的实部或虚部作为Z.realZ.imag。因此,如果你想绘制的实际部分

plt.imshow(z.real.T, extent=[-2,1,-1.5,1.5]) 

会做这项工作。

'imshow'中的参数定义了以下内容。

如果z是一个N×M矩阵,它将被解释为规则网格上的点值。通过extent指定这个网格如何在空间中延伸...

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() 

Image Result

2

你想要绘制与imshow这就是为什么你得到错误的复值,可以使用如其他人所建议的阈值,但您也可以考虑使用np.anglenp.abs。您还可以使用Python内置的reduce方法简化z的计算。

有一些乐趣与这一个,但是这显示了总体思路:

import numpy as np 
import matplotlib.pyplot as plt 

%matplotlib inline 

x, y = np.ogrid[-2:1:500j, -1.5:1.5:500j] 

# Increase this to improve the shape of the fractal 
iterations = 9 

c = x + 1j*y 

z = reduce(lambda x, y: x**2 + c, [1] * iterations, c) 

plt.figure(figsize=(10, 10)) 
plt.imshow(np.angle(z)); 

plt.figure(figsize=(10, 10)) 
plt.imshow(np.log(np.abs(z)));