9

我是 python 新手,并通过遵循 Python“科学讲义 2013.1 版”教程进行学习。请帮我解决下面屏幕截图中的这个 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() 中的各个术语是什么意思?

谢谢你。

4

4 回答 4

6

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

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

然后绘图mask,您应该在屏幕上看到设置的绘图。

要了解imshow's 论点的一般工作原理,您最好阅读文档而不是在这里询问。

于 2013-02-22T13:32:04.227 回答
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()

图像结果

于 2013-02-23T07:08:51.367 回答
2

您收到此错误是因为plt.imshow不接受复数数组。您可以将数组的实部或虚部寻址ZZ.realZ.imag。因此,如果你想绘制实部

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

会做的工作。

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

如果z是 N×M 矩阵,则将其解释为规则网格上的点值。通过extent您指定此网格在空间中的扩展方式...

于 2013-02-22T13:09:31.313 回答
2

您正在尝试使用 imshow 绘制一个复杂的值,这就是您收到该错误的原因,可以使用其他人建议的阈值,但您可能也想考虑使用np.angleor np.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)));
于 2015-04-18T04:13:33.700 回答