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 True
y False
están representados en Python como 1
y 0
, respectivamente, solo tenemos que especificar que esta matriz debe ser booleana usando el dtype
pará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 full
para 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 , full
arroja automáticamente los resultados al dtype
segundo parámetro, por lo que podemos escribir:
numpy.full((2, 2), True)
a=np.ones((2,2))
seguido de a.dtype=bool
NO funciona.
numpy.full((2,2), True, dtype=bool)
ones
y zeros
no construyen una matriz de enteros. Construyen una serie de bools directamente.
numpy.full((2,2), True)
un equivalente?
int 1
a bool True
.
ones
y zeros
, que crean matrices llenas de unos y ceros respectivamente, toman un dtype
pará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 fill
usted 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.zeros
o np.ones
como sugieren las otras respuestas.
Rápidamente ejecuté un tiempo para ver si hay alguna diferencia entre la versión np.full
y 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.empty
para inicializar una True
matriz 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!