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

4 minutos de lectura

avatar de usuario
miguel currie

En Python, ¿cómo creo una matriz numpy de formas arbitrarias rellenas con todos True o todo False?

avatar de usuario
miguel currie

La respuesta:

numpy.full((2, 2), True)

Explicación:

numpy crea matrices de todos los unos o todos los ceros muy fácilmente:

p.ej numpy.ones((2, 2)) o numpy.zeros((2, 2))

Ya que True y False se representan en Python como 1 y 0respectivamente, solo tenemos que especificar que esta matriz debe ser booleana usando el opcional dtype parámetro 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 numpy versión 1.8nosotros podemos usar full para lograr el mismo resultado con una sintaxis que muestre más claramente nuestra intención (como señala fmonegaglia):

numpy.full((2, 2), True, dtype=bool)

ACTUALIZACIÓN: 16 de enero de 2017

Desde al menos numpy versión 1.12, full lanza automáticamente a la dtype del segundo parámetro, por lo que podemos simplemente escribir:

numpy.full((2, 2), True)

  • dtype=int matriz inicializada no se puede utilizar para la selección de elementos de matriz.

    – Jichao

    14 de mayo de 2016 a las 2:07

  • Esto funciona. Sin embargo, tenga cuidado porque como dice @Jichao, a=np.ones((2,2)) seguido por a.dtype=bool No funciona.

    – popurrí56

    12 de marzo de 2017 a las 18:03


  • La respuesta asume que np.ones o np.zeros con dtype bool tienen que convertir la matriz int como booleana. ¿Es cierta esta suposición? Creo que crea una matriz booleana y no crea una matriz int primero y luego se convierte. Corrija amablemente esta respuesta si estoy en lo correcto.

    – Alok Nayak

    24 de agosto de 2018 a las 7:01

avatar de usuario
fmonegaglia

numpy.full((2,2), True, dtype=bool)

  • +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

    18/04/2016 a las 20:55

  • los ones y zeros Las respuestas no construyen una matriz de enteros. Construyen una matriz de bools directamente.

    – usuario2357112

    29 de junio de 2016 a las 16:01

  • Es numpy.full((2,2), True) ¿un equivalente?

    – Pavel

    15/10/2017 a las 16:34


  • Está en numpy 1.12+. No recuerdo si se aplica a versiones anteriores tampoco

    – fmonegaglia

    20 de octubre de 2017 a las 12:15

  • lleno tiende a ser mucho más lento que unos o ceros

    – Sr. E

    11 de marzo de 2021 a las 17:26

ones y zerosque crean matrices llenas de unos y ceros respectivamente, tome una opción dtype parámetro:

>>> 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)

avatar de usuario
MSeifert

Si no tiene que ser escribible, puede crear una matriz de este tipo 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 necesita que se pueda escribir, también puede crear una matriz vacía y fill tú 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 ceñirse a np.full, np.zeros o np.ones como sugieren las otras respuestas.

punto de referencia para la respuesta de Michael Currie

import perfplot

bench_x = perfplot.bench(
    n_range= range(1, 200),
    setup  = lambda n: (n, n),
    kernels= [
        lambda shape: np.ones(shape, dtype= bool),
        lambda shape: np.full(shape, True)
    ],
    labels = ['ones', 'full']
)

bench_x.show()

ingrese la descripción de la imagen aquí

Rápidamente corrió un tiempo para ver, si hay alguna diferencia entre el np.full y np.ones versión.

Responder: 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 USAR np.empty para inicializar un todo-True formación

Como la matriz está vacía, la memoria no está escrita y no hay garantía, cuáles serán sus valores, por ejemplo

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]

avatar de usuario
nikithashr

>>> 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 hay otros argumentos que se pueden pasar, para documentación sobre eso, verifique https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

  • Bueno, otra respuesta ya respondida usando np.full – Hace más de un año!

    – MSeifert

    15 de abril de 2017 a las 2:41

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad