Come creare una matrice numpy di tutto vero o tutto falso?


Risposte:


284

numpy consente già la creazione di matrici di tutti o di tutti zeri molto facilmente:

es. numpy.ones((2, 2))onumpy.zeros((2, 2))

Poiché Truee Falsesono rappresentati in Python come 1e 0, rispettivamente, dobbiamo solo specificare che questo array deve essere booleano usando il dtypeparametro opzionale e abbiamo finito.

numpy.ones((2, 2), dtype=bool)

ritorna:

array([[ True,  True],
       [ True,  True]], dtype=bool)

AGGIORNAMENTO: 30 ottobre 2013

Dalla versione intorpidita 1.8 , possiamo usare fullper ottenere lo stesso risultato con la sintassi che mostra più chiaramente il nostro intento (come sottolinea fmonegaglia):

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

AGGIORNAMENTO: 16 gennaio 2017

Poiché almeno numpy versione 1.12 , fulllancia automaticamente i risultati al dtypesecondo parametro, quindi possiamo semplicemente scrivere:

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


37
Hai risposto alla tua domanda nello stesso minuto in cui la domanda è stata pubblicata?
M4rtini,

26
@ M4rtini SO ti consente di pubblicare una domanda e una risposta alla domanda contemporaneamente.
Mick MacCallum,

1
dtype = int non è possibile utilizzare l'array inizializzato per la selezione dell'elemento dell'array.
Jichao,

1
Questo funziona Tuttavia, fai attenzione perché come dice @Jichao, a=np.ones((2,2))seguito da a.dtype=boolNON funziona.
medley56

8
Ora un meme famoso: devhumor.com/media/…
WLGfx il

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

12
+1 Penso che questa dovrebbe essere la risposta accettata. Sembra più naturale riempire un array di bool, piuttosto che riempirlo di numeri per lanciarli in bool.
Zelphir Kaltstahl,

5
Le risposte onese zerosnon costruiscono un array di numeri interi. Costruiscono direttamente una serie di bool.
user2357112 supporta Monica il

1
È numpy.full((2,2), True)un equivalente?
Pavel,

È in numpy 1.12+. Non ricordo se si applica anche alle versioni precedenti
fmonegaglia,

Il dtype sicuramente è memorizzato separatamente dai dati stessi quando possibile? Non riesco a immaginare NumPy fare qualsiasi sollevamento di carichi pesanti per la conversione int 1a bool True.
BallpointBen

30

onese zeros, che creano matrici piene rispettivamente di uno e di zero, accettano un dtypeparametro opzionale :

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

10

Se non deve essere scrivibile, puoi creare un tale array 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)

Se ne hai bisogno scrivibile, puoi anche creare un array vuoto e filltu stesso:

>>> arr = np.empty((2, 5), dtype=bool)
>>> arr.fill(1)
>>> arr
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True]], dtype=bool)

Questi approcci sono solo suggerimenti alternativi. In generale dovresti attenerti o np.full, come suggerito dalle altre risposte.np.zerosnp.ones


3

Ha eseguito rapidamente un timeit per vedere se ci sono differenze tra la versione np.fulle np.ones.

Risposta: 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")

Risultato:

np.ones: 0.38416870904620737s
np.full: 0.38430388597771525s


IMPORTANTE

Per quanto riguarda il post su np.empty(e non posso commentare, poiché la mia reputazione è troppo bassa):

NON FARLO. NON UTILIZZARE np.emptyper inizializzare un Truearray completo

Poiché l'array è vuoto, la memoria non è scritta e non vi è alcuna garanzia, quali saranno i tuoi valori, ad es

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


0

punto di riferimento per la risposta di 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()

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.