2014-04-11 5 views
0

Cellular-Automaton (분명히 끝나지 않았 음)을 프로그래밍하는 동안 경계와 관련된 문제가 발생했습니다. 이 섹션의 결과에 대한 목표는 0과 1 사이의 임의 값 (및 직접 이웃)의 평균을 묘사하는 매트릭스의 위치 (i, j)에 값을 갖는 것입니다.Python 범위 외 문제

어떻게 관리 할 수 ​​있습니까? 이것은 경계 조건/규칙을 위반하지 않고? size 행렬의 크기

import numpy as np 

def arr(size): 
    arraySize = size 
    Z = np.array([[np.random.uniform(0, 1) for x in range(arraySize)] for y in range(arraySize)]) 
    return Z 

def each_average(i,j,array): 
    x= (array[i])+(array[i+1])+(array[i-1]) 
    y= x[j-1]+x[j]+x[j+1] 
    f= y/9 
    return f 


def average(array): 
    i,j=0,0 
    average=[] 
    while j in range(len(array)): 
     while i in range(len(array)): 
      i=i+1 
      j=j+1 
      x = each_average(i,j,array) 
      average.append(x) 
    return average 

Z=arr(4) 
print average(Z) 
+0

왜 fors 대신에 while 루프를 사용하고 있습니까? 그것은 나에게 이상하게 보입니다. 'i'의 가능한 모든 값과'j'의 가능한 모든 값을 쌍으로 만들려고한다면, 여기에서는 일어나지 않습니다. 'each_average' 호출 바로 전에'print i, j'를 놓으면 i와 j가 항상 같음을 알 수 있습니다. – Kevin

답변

0
def each_average(i, j, matrix, size): 
    size -= 1 
    values = [matrix[i][j]] 
    if i > 0: 
     values.append(matrix[i-1][j]) 
    if i < size: 
     values.append(matrix[i+1][j]) 
    if j > 0: 
     values.append(matrix[i][j-1]) 
    if j < size: 
     values.append(matrix[i][j+1]) 

    return sum(values)/5 

. 당신이 그것을하고 이웃의 평균 행렬에 각각의 값을 변환 할 경우

는 : 다시 전체 매트릭스에 통과 할 필요가 없습니다으로

def average(matrix, size): 
    average_matrix = [] 
    for i in range(size): 
     average_matrix.append([]) 
     for j in range(size): 
      average_matrix[i].append(each_average(i, j, matrix, size)) 
    return average_matrix 

그러나, 이것은 비효율적이다.

def average(matrix, size): 
    size -= 1 
    average_matrix = [] 
    for i in range(size): 
     average_matrix.append([]) 
     for j in range(size): 
      values = [matrix[i][j]] 
      if i > 0: 
       values.append(matrix[i-1][j]) 
      if i < size: 
       values.append(matrix[i+1][j]) 
      if j > 0: 
       values.append(matrix[i][j-1]) 
      if j < size: 
       values.append(matrix[i][j+1]) 
      average_matrix.append(sum(values)/5) 
    return average_matrix