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é 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)
a=np.ones((2,2))seguito da a.dtype=boolNON funziona.
numpy.full((2,2), True, dtype=bool)
onese zerosnon costruiscono un array di numeri interi. Costruiscono direttamente una serie di bool.
numpy.full((2,2), True)un equivalente?
int 1a bool True.
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)
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
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]]
>>> 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!