2017-12-05 22 views
-6

コンウェイのライフクローンゲームで次のコードが見つかりました。 次のコードがどのくらい正確に実行されているか分かりません。誰かがコードがどのように実行されるかについて深い説明をすることができますか?Python:Numpyスライシング絶頂深化

def iterate(Z): 
    # find number of neighbors that each square has 
    N = np.zeros(Z.shape) 
    N[1:, 1:] += Z[:-1, :-1] 
    N[1:, :-1] += Z[:-1, 1:] 
    N[:-1, 1:] += Z[1:, :-1] 
    N[:-1, :-1] += Z[1:, 1:] 
    N[:-1, :] += Z[1:, :] 
    N[1:, :] += Z[:-1, :] 
    N[:, :-1] += Z[:, 1:] 
    N[:, 1:] += Z[:, :-1] 
    # a live cell is killed if it has fewer than 2 or more than 3 neighbours. 
    part1 = ((Z == 1) & (N < 4) & (N > 1)) 
    # a new cell forms if a square has exactly three members 
    part2 = ((Z == 0) & (N == 3)) 
    return (part1 | part2).astype(int) 
+3

にアニメーションあなたは(https://docs.scipy.org/doc/numpy-1.13.0/reference/arrays.indexing.html)[マニュアルを読む]を試みたことがありますか? –

答えて

0

すべてN+=ライン後print(N)の行を追加し、さまざまなZ配列を試してみてください。例えば

が中央に1Sのブロックと小zを定義:関数へ

In [29]: z = np.zeros((10,10),int) 
In [31]: z[4:6,4:6]=1 
In [34]: z[4:8,5]=1 

In [35]: z 
Out[35]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

パスを:

In [36]: iterate(z) 
[[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.] 
[ 0. 0. 0. 1. 2. 2. 1. 0. 0. 0.] 
[ 0. 0. 0. 2. 3. 3. 2. 0. 0. 0.] 
[ 0. 0. 0. 2. 4. 4. 3. 0. 0. 0.] 
[ 0. 0. 0. 1. 4. 3. 3. 0. 0. 0.] 
[ 0. 0. 0. 0. 2. 1. 2. 0. 0. 0.] 
[ 0. 0. 0. 0. 1. 1. 1. 0. 0. 0.] 
[ 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]] 

Nは、近隣の数をカウントしました1.自分で数をチェックしてください。

Out[36]: 
array([[0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 1, 1, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 1, 0, 0, 0], 
     [0, 0, 0, 0, 0, 1, 1, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
     [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]) 

さまざまなパターンを試し、繰り返しを繰り返し、パターンの変化を見てください。一部のようなラインでは、離れた注文ファッション、いくつかの「まばたき」の一部の動き、等

ダイ:

N[1:, 1:] += Z[:-1, :-1] 

RHS(ここでは9×9)の​​左上部分です。 LHSは右下がり、再び9x9です。 8つの近隣(3x3ブロック内で中心を引いたもの)を計算すると、8つのN+=という式があります。このオフセットスライスを使用すると、一度にZのすべてのポイントのカウントを行うことができます。

開始のために、1行の配列は

In [47]: z = np.zeros((1,10),int) 
In [49]: z[0,4:7]=1 
In [50]: z 
Out[50]: array([[0, 0, 0, 0, 1, 1, 1, 0, 0, 0]]) 
In [51]: iterate(z) 
[[ 0. 0. 0. 1. 1. 2. 1. 1. 0. 0.]] 
Out[51]: array([[0, 0, 0, 0, 0, 1, 0, 0, 0, 0]]) 

を視覚化する方が簡単かもしれない私はこれがあることzのすべてのエッジの値が0

ている場合は、この配列はgliderを作成する最高の作品だと思いますhttps://en.wikipedia.org/wiki/Glider_(Conway%27s_Life)

In [64]: z = np.zeros((10,10),int) 
In [65]: z[1,2]=1;z[2,3]=1;z[3,1:4]=1 
関連する問題