En Python, ¿cómo creo un conjunto de formas arbitrarias llenas de todo verdadero o todo falso?
En Python, ¿cómo creo un conjunto de formas arbitrarias llenas de todo verdadero o todo falso?
Respuestas:
numpy ya permite la creación de matrices de todos unos o todos ceros muy fácilmente:
por ejemplo numpy.ones((2, 2))onumpy.zeros((2, 2))
Dado que Truey Falseestán representados en Python como 1y 0, respectivamente, solo tenemos que especificar que esta matriz debe ser booleana usando el dtypeparámetro opcional y hemos terminado.
numpy.ones((2, 2), dtype=bool)
devoluciones:
array([[ True, True],
[ True, True]], dtype=bool)
ACTUALIZACIÓN: 30 de octubre de 2013
Desde la versión 1.8 de numpy , podemos usar fullpara lograr el mismo resultado con la sintaxis que muestra más claramente nuestra intención (como señala fmonegaglia):
numpy.full((2, 2), True, dtype=bool)
ACTUALIZACIÓN: 16 de enero de 2017
Como al menos la versión 1.12 de numpy , fullarroja automáticamente los resultados al dtypesegundo parámetro, por lo que podemos escribir:
numpy.full((2, 2), True)
a=np.ones((2,2))seguido de a.dtype=boolNO funciona.
numpy.full((2,2), True, dtype=bool)
onesy zerosno construyen una matriz de enteros. Construyen una serie de bools directamente.
numpy.full((2,2), True)un equivalente?
int 1a bool True.
onesy zeros, que crean matrices llenas de unos y ceros respectivamente, toman un dtypeparámetro opcional :
>>> numpy.ones((2, 2), dtype=bool)
array([[ True, True],
[ True, True]], dtype=bool)
>>> numpy.zeros((2, 2), dtype=bool)
array([[False, False],
[False, False]], dtype=bool)
Si no tiene que ser grabable, puede crear una matriz con np.broadcast_to:
>>> import numpy as np
>>> np.broadcast_to(True, (2, 5))
array([[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
Si lo necesita escribible, también puede crear una matriz vacía y fillusted mismo:
>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True, True, True, True, True],
[ True, True, True, True, True]], dtype=bool)
Estos enfoques son solo sugerencias alternativas. En general, debe seguir np.full, np.zeroso np.onescomo sugieren las otras respuestas.
Rápidamente ejecuté un tiempo para ver si hay alguna diferencia entre la versión np.fully np.ones.
Respuesta: no
import timeit
n_array, n_test = 1000, 10000
setup = f"import numpy as np; n = {n_array};"
print(f"np.ones: {timeit.timeit('np.ones((n, n), dtype=bool)', number=n_test, setup=setup)}s")
print(f"np.full: {timeit.timeit('np.full((n, n), True)', number=n_test, setup=setup)}s")
Resultado:
np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s
IMPORTANTE
Con respecto a la publicación sobre np.empty(y no puedo comentar, ya que mi reputación es demasiado baja):
No hagas eso. NO USE np.emptypara inicializar una Truematriz completa
Como la matriz está vacía, la memoria no se escribe y no hay garantía de cuáles serán sus valores, p. Ej.
>>> print(np.empty((4,4), dtype=bool))
[[ True True True True]
[ True True True True]
[ True True True True]
[ True True False False]]
>>> a = numpy.full((2,4), True, dtype=bool)
>>> a[1][3]
True
>>> a
array([[ True, True, True, True],
[ True, True, True, True]], dtype=bool)
numpy.full (Tamaño, Valor escalar, Tipo). También se pueden pasar otros argumentos, para obtener documentación al respecto, consulte https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html
np.full: ¡hace más de un año!