0

Please don't disregard the long code, it is really simple. Basicaly I am trying to do a Game of Life in Python. Here is where I get the error.

When I call the neighbour_count() function I can correctly get the number of neighbours that each element have.

def neighbours_count(self):

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

Then I want to make the next step and act on 4 rules, which it does and the game advances correctly:

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

However, when I want to DO THE SAME THING AGAIN (i.e. count the neighbours), then the second time I call the neighbour_count function I get:

TypeError: 'numpy.ndarray' object is not callable

I have spent unreasonable amount of time on this, can anyone help please?

Thanks.

1 Answer 1

3

Originally, neighbours_count is a method:

def neighbours_count(self):

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

But then you replace this method in the marked line by the result of the convolve2d function (which you've confusingly also called neighbours_count), so when you try to call it again, you don't get the method, you get the value. This is an ndarray, and it's not callable, and so:

TypeError: 'numpy.ndarray' object is not callable

I'm not sure what you're trying to do, but if you want to stash a value somewhere, people often use a single underscore, e.g. self._neighbours_count.

Sign up to request clarification or add additional context in comments.

1 Comment

Thanks, this is extremely helpful! I did not expect the answer so soon. I didnt realize I was actually replacing the method. Thanks again!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.