2014-12-31 4 views
0

Пожалуйста, не игнорируйте длинный код, это действительно просто. Basicaly Я пытаюсь сделать Game of Life в Python. Здесь я получаю ошибку.Объект 'numpy.ndarray' не может быть вызван

Когда я вызываю функцию neighbour_count(), я могу правильно получить число соседей, которые имеют каждый элемент.

def neighbours_count(self): 

    neighbours_count = convolve2d(self.board, np.ones((3, 3)), 
            mode='same', boundary='wrap') - self.board          
    self.neighbours_count = neighbours_count 

Тогда я хочу, чтобы сделать следующий шаг и действовать на 4 правила, которые она делает, и игра переходит правильно:

def make_step(self): 
    # We want to check the actual board and not the board that exists after eg. step 2. 
    self.board_new = np.zeros(shape=(self.size, self.size)) 

    # 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population. 
    mask = (self.board == 1) & (self.neighbours_count < 2) 
    self.board_new[mask] = 0 

    # 2. Any live cell with two or three live neighbours lives on to the next generation. 
    mask1 = (self.board == 1) & (self.neighbours_count == 2) 
    self.board_new[mask1] = 1 
    mask2 = (self.board == 1) & (self.neighbours_count == 3) 
    self.board_new[mask2] = 1   

    # 3. Any live cell with more than three live neighbours dies, as if by overcrowding. 
    mask = (self.board == 1) & (self.neighbours_count > 3) 
    self.board_new[mask] = 0 

    # 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. 
    mask = (self.board == 0) & (self.neighbours_count == 3) 
    self.board_new[mask] = 1 

    self.board = self.board_new 

Однако, когда я хочу сделать то же самое еще раз (т.е. сосчитать соседей), то второй раз я называю функцию neighbour_count я получаю:

TypeError: 'numpy.ndarray' object is not callable

Я провел необоснованное количество времени на это, может кто-нибудь помочь, пожалуйста?

Спасибо.

ответ

2

Первоначально neighbours_count является метод:

def neighbours_count(self): 

    neighbours_count = convolve2d(self.board, np.ones((3, 3)), 
            mode='same', boundary='wrap') - self.board          
    self.neighbours_count = neighbours_count 
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 

Но тогда вы заменить этот метод в отмеченной строке результата функции convolve2d (который вы имеете Смутно также называемый neighbours_count), поэтому, когда вы пытаетесь вызвать его снова, вы не получите метод, вы получите значение. Это ndarray, и это не отозваны, и так:

TypeError: 'numpy.ndarray' object is not callable 

Я не уверен, что вы пытаетесь сделать, но если вы хотите, чтобы копить значение где-то, люди часто используют один символ подчеркивания, например self._neighbours_count.

+0

Спасибо, это очень полезно! Я не ожидал ответа так скоро. Я не понимал, что фактически заменяю метод. Еще раз спасибо! –

Смежные вопросы