¿Qué significa en las matrices NumPy?

Perdón por la estúpida pregunta. Estoy progtwigndo en PHP pero encontré un buen código en Python y quiero “recrearlo” en PHP. Pero estoy bastante frustrado por la línea.

self.h = -0.1 self.activity = numpy.zeros((512, 512)) + self.h self.activity[:, :] = self.h 

Pero no entiendo lo que hace.

 [:, :] 

media.

Además no pude “Google It”.

Codigo completo

 import math import numpy import pygame from scipy.misc import imsave from scipy.ndimage.filters import gaussian_filter class AmariModel(object): def __init__(self, size): self.h = -0.1 self.k = 0.05 self.K = 0.125 self.m = 0.025 self.M = 0.065 self.stimulus = -self.h * numpy.random.random(size) self.activity = numpy.zeros(size) + self.h self.excitement = numpy.zeros(size) self.inhibition = numpy.zeros(size) def stimulate(self): self.activity[:, :] = self.activity > 0 sigma = 1 / math.sqrt(2 * self.k) gaussian_filter(self.activity, sigma, 0, self.excitement, "wrap") self.excitement *= self.K * math.pi / self.k sigma = 1 / math.sqrt(2 * self.m) gaussian_filter(self.activity, sigma, 0, self.inhibition, "wrap") self.inhibition *= self.M * math.pi / self.m self.activity[:, :] = self.h self.activity[:, :] += self.excitement self.activity[:, :] -= self.inhibition self.activity[:, :] += self.stimulus class AmariMazeGenerator(object): def __init__(self, size): self.model = AmariModel(size) pygame.init() self.display = pygame.display.set_mode(size, 0) pygame.display.set_caption("Amari Maze Generator") def run(self): pixels = pygame.surfarray.pixels3d(self.display) index = 0 running = True while running: self.model.stimulate() pixels[:, :, :] = (255 * (self.model.activity > 0))[:, :, None] pygame.display.flip() for event in pygame.event.get(): if event.type == pygame.QUIT: running = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_ESCAPE: running = False elif event.key == pygame.K_s: imsave("{0:04d}.png".format(index), pixels[:, :, 0]) index = index + 1 elif event.type == pygame.MOUSEBUTTONDOWN: position = pygame.mouse.get_pos() self.model.activity[position] = 1 pygame.quit() def main(): generator = AmariMazeGenerator((512, 512)) generator.run() if __name__ == "__main__": main() 

El [:, :] representa todo desde el principio hasta el final, al igual que para las listas. La diferencia es que la primera : representa la primera y la segunda : para la segunda dimensión.

 a = numpy.zeros((3, 3)) In [132]: a Out[132]: array([[ 0., 0., 0.], [ 0., 0., 0.], [ 0., 0., 0.]]) 

Asignando a la segunda fila:

 In [133]: a[1, :] = 3 In [134]: a Out[134]: array([[ 0., 0., 0.], [ 3., 3., 3.], [ 0., 0., 0.]]) 

Asignando a la segunda columna:

 In [135]: a[:, 1] = 4 In [136]: a Out[136]: array([[ 0., 4., 0.], [ 3., 4., 3.], [ 0., 4., 0.]]) 

Asignando a todos:

 In [137]: a[:] = 10 In [138]: a Out[138]: array([[ 10., 10., 10.], [ 10., 10., 10.], [ 10., 10., 10.]]) 

Numpy usa tuplas como índices. En este caso, esta es una asignación de segmento detallada.

 [0] #means line 0 of your matrix [(0,0)] #means cell at 0,0 of your matrix [0:1] #means lines 0 to 1 excluded of your matrix [:1] #excluding the first value means all lines until line 1 excluded [1:] #excluding the last param mean all lines starting form line 1 included [:] #excluding both means all lines [::2] #the addition of a second ':' is the sampling. (1 item every 2) [::] #exluding it means a sampling of 1 [:,:] #simply uses a tuple (a single , represents an empty tuple) instead of an index. 

Es equivalente a la más simple.

 self.activity[:] = self.h 

(que también funciona para listas regulares también)

Esta es la asignación de rebanada. Técnicamente, se llama 1.

 self.activity.__setitem__((slice(None,None,None),slice(None,None,None)),self.h) 

que establece todos los elementos en self.activity a cualquier valor que self.h esté almacenando. El código que tienes allí parece realmente redundante. Por lo que puedo decir, puede eliminar la adición en la línea anterior, o simplemente usar la asignación de división:

 self.activity = numpy.zeros((512,512)) + self.h 

o

 self.activity = numpy.zeros((512,512)) self.activity[:,:] = self.h 

Quizás la forma más rápida de hacer esto es asignar una matriz vacía y .fill con el valor esperado:

 self.activity = numpy.empty((512,512)) self.activity.fill(self.h) 

1 En realidad, __setslice__ se intenta antes de llamar a __setitem__ , pero __setslice__ está en desuso, y no debe usarse en el código moderno a menos que tenga una buena razón para ello.