Jak stworzyć tablicę numpy wszystkich Prawd lub wszystkich False?

194

W Pythonie, w jaki sposób mogę utworzyć tablicę liczb dowolnych o dowolnym kształcie wypełnioną wszystkimi Prawdą lub Wszystkimi False?

Michael Currie
źródło

Odpowiedzi:

281

numpy już teraz pozwala bardzo łatwo tworzyć tablice wszystkich zer lub jedynek:

np. numpy.ones((2, 2))lubnumpy.zeros((2, 2))

Ponieważ Truei Falsesą reprezentowane w Pythonie jako 1i 0, musimy tylko określić, że ta tablica powinna być logiczna przy użyciu opcjonalnego dtypeparametru i gotowe.

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

zwroty:

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

AKTUALIZACJA: 30 października 2013 r

Od wersji 1.8 Numpy możemy fullosiągnąć ten sam wynik dzięki składni, która lepiej pokazuje nasze zamiary (jak wskazuje fmonegaglia):

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

AKTUALIZACJA: 16 stycznia 2017 r

Od wersji co najmniej numpy 1.12 , fullautomatycznie rzutuje wyniki dtypena drugi parametr, więc możemy po prostu napisać:

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

Michael Currie
źródło
37
Czy odpowiedziałeś na własne pytanie w tej samej minucie, w której zostało zadane pytanie?
M4rtini,
26
@ M4rtini SO umożliwia jednoczesne opublikowanie pytania i odpowiedzi na pytanie.
Mick MacCallum
1
Zainicjowana tablica dtype = int nie może być używana do wyboru elementu tablicy.
Jichao
1
To działa. Bądź jednak ostrożny, ponieważ jak mówi @Jichao, a=np.ones((2,2))po nim a.dtype=boolNIE działa.
medley56
8
Teraz sławny mem: devhumor.com/media/…
WLGfx
93
numpy.full((2,2), True, dtype=bool)
fmonegaglia
źródło
12
+1 Myślę, że to powinna być zaakceptowana odpowiedź. Bardziej naturalne wydaje się wypełnienie tablicy boolami niż wypełnienie liczbami, aby przelać je na boole.
Zelphir Kaltstahl 18.04.16
5
Odpowiedzi onesi zerosnie konstruują tablicy liczb całkowitych. Bezpośrednio budują tablicę booli.
user2357112 obsługuje Monicę
1
Jest numpy.full((2,2), True)odpowiednikiem?
Pavel
Jest w numpy 1.12+. Nie pamiętam, czy dotyczy to również poprzednich wersji
fmonegaglia,
Surly dtype jest przechowywany oddzielnie od samych danych, jeśli to możliwe? Nie mogę sobie wyobrazić numpy robi żadnego podnoszenia ciężkich konwersji int 1do bool True.
BallpointBen,
30

onesi zeros, które tworzą tablice pełne odpowiednio zer i jedynek, przyjmują opcjonalny dtypeparametr:

>>> 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 obsługuje Monikę
źródło
10

Jeśli nie musi być zapisywalny, możesz utworzyć taką tablicę za pomocą 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)

Jeśli potrzebujesz zapisu, możesz także utworzyć pustą tablicę i fillsamodzielnie:

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

Te podejścia są tylko alternatywnymi sugestiami. W ogóle należy trzymać się z np.full, np.zeroslub np.onesjak inni sugerują odpowiedzi.

MSeifert
źródło
3

Szybko sprawdziłem, czy są jakieś różnice między wersją np.fulla np.oneswersją.

Odpowiedź: Nie

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

Wynik:

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


WAŻNY

Jeśli chodzi o post o np.empty(i nie mogę komentować, ponieważ moja reputacja jest zbyt niska):

NIE Rób tego. NIE UŻYWAJ np.emptydo zainicjowania Truetablicy all- array

Ponieważ tablica jest pusta, pamięć nie jest zapisywana i nie ma gwarancji, jakie będą twoje wartości, np

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]
Joschua
źródło
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 (rozmiar, wartość skalarna, typ). Istnieją również inne argumenty, które można przekazać, w celu uzyskania dokumentacji na ten temat sprawdź https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

nikithashr
źródło
6
Cóż, inna odpowiedź już odpowiedziała przy użyciu np.full- ponad rok temu!
MSeifert,