In Python, come posso creare una matrice insensibile di forma arbitraria piena di tutto vero o tutto falso?
In Python, come posso creare una matrice insensibile di forma arbitraria piena di tutto vero o tutto falso?
Risposte:
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é True
e False
sono rappresentati in Python come 1
e 0
, rispettivamente, dobbiamo solo specificare che questo array deve essere booleano usando il dtype
parametro 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 full
per 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 , full
lancia automaticamente i risultati al dtype
secondo parametro, quindi possiamo semplicemente scrivere:
numpy.full((2, 2), True)
a=np.ones((2,2))
seguito da a.dtype=bool
NON funziona.
numpy.full((2,2), True, dtype=bool)
ones
e zeros
non costruiscono un array di numeri interi. Costruiscono direttamente una serie di bool.
numpy.full((2,2), True)
un equivalente?
int 1
a bool True
.
ones
e zeros
, che creano matrici piene rispettivamente di uno e di zero, accettano un dtype
parametro 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)
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 fill
tu 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.zeros
np.ones
Ha eseguito rapidamente un timeit per vedere se ci sono differenze tra la versione np.full
e 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.empty
per inizializzare un True
array 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]]
>>> 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 (Dimensione, Valore scalare, Tipo). Esistono anche altri argomenti che possono essere passati, per la documentazione su questo, consultare https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html
np.full
- più di un anno fa!