El siguiente código genera un tipo de perfil 'Skyline' donde los valores iniciales son 0 y el perfil se realiza con 1. Implementé usando A para el bucle y me pregunto si hay una forma más eficiente de obtener el mismo resultado.

#https://app.codility.com/programmers/task/max_square_on_matrix/
import numpy as np
np.random.seed(2)
A = np.zeros((5,5), dtype=int)
X = np.random.randint(low=1, high=5, size = 5)

print('A ')
print(A)
print('----------------------')
print('X ')
print(X)
#
for j in range(len(A)):
        A[5-X[j]:5,j] = 1
print('----------------------')
print('A modified ')
print(A)
1
LP0 26 may. 2021 a las 21:11

1 respuesta

La mejor respuesta

A menos que desee usar Matrix A para un cálculo que resulte en números distintos de 1 o 0, simplemente puede tratar 1 y 0 como verdadero y falso:

N = 5
X = np.random.randint(low=1, high=N, size = (N,1) )
A = (X >= range(N,0,-1)).T

EDITAR:

OooOop, respondí demasiado rápido. Resulta que mi método no es "más eficiente" que el bucle para N = 5.

Además, las siguientes funcionan ligeramente mejor que mi respuesta original, especialmente para N:

a = np.array(range(N,0,-1),ndmin=2).T
X = np.random.randint(low=1, high=N, size=N)
A = X>=a

En mi computadora, este es un poco más lento que el bucle para el norte cuando n = 5. Sin embargo, cuando n = 100, es 2 veces más rápido que hacer el bucle.

1
Alexander S. Brunmayr 26 may. 2021 a las 23:27