9

私はPythonを初めて使用し、Pythonの「科学講義ノートリリース2013.1」チュートリアルに従って学習します。以下のsrcreenshot(Pg 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:画像データをfloatに変換できません」

このエラーは正確にはどういう意味で、どのように修正するのですか?imshow()関数を理解するのが難しいと感じています。imshow()内の個々の用語はどういう意味ですか?

ありがとうございました。

4

4 に答える 4

6

マンデルブロ集合は、zプロットしようとしている値ではありません。複素数であるため、問題が発生します。マンデルブロ集合はp、漸化式z_n = z_n-1**2 + pが制限されたままの複素平面の点で構成されています。これは、数回の反復後の結果をあるしきい値と比較することにより、実用的な方法でチェックされます。あなたの場合、forループの後に次の行を追加すると、次のようになります。

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

次にプロットmaskすると、設定されたプロットが画面に表示されます。

の引数の一般的な動作を理解するには、ここで質問するよりもドキュメントimshowを読む方がよいでしょう。

于 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複素数の配列を受け入れないため、このエラーが発生します。Z配列の実数部Z.realまたは虚数部をまたはとしてアドレス指定できますZ.imag。したがって、実際の部分をプロットしたい場合

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

仕事をします。

'imshow'の引数は、次のことを定義します。

がN行M列の行列の場合z、通常のグリッド上のポイント値として解釈されます。extentこのグリッドが空間でどのように拡張するかを指定することによって...

于 2013-02-22T13:09:31.313 に答える
2

imshowを使用して複素数値をプロットしようとしているため、エラーが発生し、他の人が示唆しているようにしきい値を使用できますが、np.angleまたはの使用も検討することをお勧めnp.absします。reducePythonの組み込みメソッドを使用して、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 に答える