¿Cómo crear una matriz numpy de todo Verdadero o todo Falso?

Respuestas:

281

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)

Michael Currie
fuente
37
¿Respondió su propia pregunta en el mismo minuto en que se publicó la pregunta?
M4rtini
26
@ M4rtini SO le permite publicar una pregunta y una respuesta a la pregunta simultáneamente.
Mick MacCallum
1
dtype = int matriz inicializada no se puede utilizar para la selección de elementos de matriz.
Jichao
1
Esto funciona. Sin embargo, tenga cuidado porque, como dice @Jichao, a=np.ones((2,2))seguido de a.dtype=boolNO funciona.
medley56
8
Ahora un famoso meme: devhumor.com/media/…
WLGfx
93
numpy.full((2,2), True, dtype=bool)
fmonegaglia
fuente
12
+1 Creo que esta debería ser la respuesta aceptada. Parece más natural llenar una matriz con bools que llenarla con números para convertirlos en bools.
Zelphir Kaltstahl
55
Las respuestas onesy zerosno construyen una matriz de enteros. Construyen una serie de bools directamente.
user2357112 es compatible con Monica el
1
Es numpy.full((2,2), True)un equivalente?
Pavel
Está en numpy 1.12+. No recuerdo si se aplica a versiones anteriores tampoco
fmonegaglia
¿Dtype Surly se almacena por separado de los datos en sí mismos cuando es posible? No me puedo imaginar numpy hacer ningún trabajo pesado para convertir int 1a bool True.
BallpointBen
30

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)
user2357112 es compatible con Monica
fuente
10

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.

MSeifert
fuente
3

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]]
Joschua
fuente
0
>>> 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

nikithashr
fuente
66
Bueno, otra respuesta ya respondió usando np.full: ¡hace más de un año!
MSeifert