una tutorial recorrer multiplicacion matriz matrices libreria funcion ejemplos arreglos arange python numpy multidimensional-array vectorization

tutorial - Compruebe si todos los elementos son verdaderos en ventanas deslizantes en una matriz 2D: Python



python matrices tutorial (1)

Enfoque # 1

Aquí hay un enfoque con convolución 2D :

from scipy.signal import convolve2d as conv2 out = (conv2(grid,np.ones((2,2),dtype=int),''valid'')==4).astype(int)

Ejecución de muestra -

In [118]: grid Out[118]: array([[False, True, True, True], [ True, True, True, True], [ True, True, True, True], [ True, True, True, False]], dtype=bool) In [119]: (conv2(grid,np.ones((2,2),dtype=int),''valid'')==4).astype(int) Out[119]: array([[0, 1, 1], [1, 1, 1], [1, 1, 0]])

Tenga en cuenta que la última fila y la última columna de la salida esperada serían todos ceros con la matriz de salida inicializada. Esto se debe a la naturaleza deslizante del código, ya que no tendrá mucha extensión a lo largo de las filas y columnas.

Enfoque # 2

Aquí hay otro con filtro uniforme 2D -

from scipy.ndimage.filters import uniform_filter as unif2d out = unif2d(grid,size=2).astype(int)[1:,1:]

Enfoque n. ° 3

Aquí hay otro con vista en ventana deslizante 4D -

from skimage.util import view_as_windows as viewW out = viewW(grid,(2,2)).all(axis=(2,3)).astype(int)

Con all(axis=(2,3)) eso all(axis=(2,3)) , solo estamos revisando las dimensiones de cada ventana para que todos los elementos sean todos elementos True .

Prueba de tiempo de ejecución

In [122]: grid = np.random.rand(5000,5000)>0.1 In [123]: %timeit (conv2(grid,np.ones((2,2),dtype=int),''valid'')==4).astype(int) 1 loops, best of 3: 520 ms per loop In [124]: %timeit unif2d(grid,size=2).astype(int)[1:,1:] 1 loops, best of 3: 210 ms per loop In [125]: %timeit viewW(grid,(2,2)).all(axis=(2,3)).astype(int) 1 loops, best of 3: 614 ms per loop

Tengo una matriz numpy multidimensional donde los elementos son valores True o False:

import numpy as np #just making a toy array grid to show what I want to do grid = np.ones((4,4),dtype = ''bool'') grid[0,0]=False grid[-1,-1]=False #now grid has a few false values but is a 4x4 filled with mostly true values

Ahora necesito generar otra matriz M, donde el valor en cada sitio M [i, j] depende de la cuadrícula [i: i + 2, j: j + 2] como en

M = np.empty((4x4)) #elements to be filled #here is the part I want to clean up for ii in range(4): for jj in range(4): #details here are unimportant. It''s just that M[ii,jj] depends on #multiple elements of grid in some way if ii+2<=4 and jj+2<=4: M[ii,jj] = np.all(grid[ii:ii+2,jj:jj+2]==True) else: M[ii,jj] = False

¿Hay alguna manera de llenar la matriz M utilizando elementos de la cuadrícula sin doble bucles?