4

以下のコードは、Python と matplotlib を使用してコンウェイのライフ ゲームのアニメーションを作成します。

なぜ私がしなければならないのか分かりません:

grid = newGrid.copy()
mat.set_data(grid)

単純に:

mat.set_data(newGrid)

上記のコピーなしで、プロットに関連付けられた配列を更新するにはどうすればよいですか?

import numpy as np
import matplotlib.pyplot as plt 
import matplotlib.animation as animation

N = 100
ON = 255
OFF = 0
vals = [ON, OFF]

# populate grid with random on/off - more off than on
grid = np.random.choice(vals, N*N, p=[0.2, 0.8]).reshape(N, N)

def update(data):
  global grid
  newGrid = grid.copy()
  for i in range(N):
    for j in range(N):
      total = (grid[i, (j-1)%N] + grid[i, (j+1)%N] + 
               grid[(i-1)%N, j] + grid[(i+1)%N, j] + 
               grid[(i-1)%N, (j-1)%N] + grid[(i-1)%N, (j+1)%N] + 
               grid[(i+1)%N, (j-1)%N] + grid[(i+1)%N, (j+1)%N])/255

      if grid[i, j]  == ON:
        if (total < 2) or (total > 3):
          newGrid[i, j] = OFF
      else:
        if total == 3:
          newGrid[i, j] = ON

  grid = newGrid.copy()
  mat.set_data(grid)
  return mat 

fig, ax = plt.subplots()
mat = ax.matshow(grid)
ani = animation.FuncAnimation(fig, update, interval=50,
                              save_count=50)
plt.show()

出力は正しいようです。グライダーやその他の予想されるパターンが表示されます。

Python/matplotlib を使用したコンウェイのライフ ゲーム

4

1 に答える 1

2

mat.set_data()のコピーが必要な特別な理由はありませんnewGrid。重要なことは、グローバルgridが反復ごとに更新されることです。

def update(data):
  global grid
  newGrid = grid.copy()

  """
  do your updating. this needs to be done on a copy of 'grid' because you are
  updating element-by-element, and updates to previous rows/columns will
  affect the result at 'grid[i,j]' if you don't use a copy
  """

  # you do need to update the global 'grid' otherwise the simulation will
  # not progress, but there's no need to copy()
  mat.set_data(newGrid)
  grid = newGrid

  # # there's no reason why you couldn't do it in the opposite order
  # grid = newGrid
  # mat.set_data(grid)

  # at least in my version of matplotlib (1.2.1), the animation function must
  # return an iterable containing the updated artists, i.e. 'mat,' or '[mat]',
  # not 'mat'
  return [mat]

また、すべてのフレームで背景を再描画しないように、FuncAnimation渡すことをお勧めします。blit=True

于 2013-06-21T10:47:26.333 に答える