Wie erstelle ich ein numpy Array von allen Wahren oder allen Falschen?

193

Wie erstelle ich in Python ein numpy-Array beliebiger Form, das mit allen Wahren oder allen Falschen gefüllt ist?

Michael Currie
quelle

Antworten:

281

Mit numpy können bereits sehr einfach Arrays mit allen Einsen oder Nullen erstellt werden:

zB numpy.ones((2, 2))odernumpy.zeros((2, 2))

Da Trueund Falsesind in Python dargestellt , wie 1und 0jeweils haben wir nur dieses Array angeben sollte boolean die optional mit dtypeParametern und wir sind fertig.

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

kehrt zurück:

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

UPDATE: 30. Oktober 2013

Seit numpy Version 1.8 können wir fulldas gleiche Ergebnis mit einer Syntax erzielen, die unsere Absicht deutlicher zeigt (wie fmonegaglia hervorhebt):

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

UPDATE: 16. Januar 2017

Da mindestens numpy Version 1.12 , fullwirft automatisch Ergebnisse der dtypevon dem zweiten Parameter, so können wir nur schreiben:

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

Michael Currie
quelle
37
Haben Sie Ihre eigene Frage in derselben Minute beantwortet, in der die Frage gestellt wurde?
M4rtini
26
Mit @ M4rtini SO können Sie gleichzeitig eine Frage und eine Antwort auf die Frage posten.
Mick MacCallum
1
dtype = int initialisiertes Array kann nicht für die Auswahl von Arrayelementen verwendet werden.
Jichao
1
Das funktioniert. Seien Sie jedoch vorsichtig, da, wie @Jichao sagt, a=np.ones((2,2))gefolgt von a.dtype=boolNICHT funktioniert.
Medley56
8
Jetzt ein berühmtes Mem: devhumor.com/media/…
WLGfx
93
numpy.full((2,2), True, dtype=bool)
Fmonegaglia
quelle
12
+1 Ich denke, dies sollte die akzeptierte Antwort sein. Es scheint natürlicher, ein Array mit Bools zu füllen, als es mit Zahlen zu füllen, um sie in Bools umzuwandeln.
Zelphir Kaltstahl
5
Die onesund zerosAntworten bilden kein Array von ganzen Zahlen. Sie bauen direkt eine Reihe von Bools.
user2357112 unterstützt Monica
1
Ist numpy.full((2,2), True)ein Äquivalent?
Pavel
Es ist in numpy 1.12+. Ich erinnere mich nicht, ob es auch für frühere Versionen gilt
fmonegaglia
Sicherlich wird dtype wenn möglich getrennt von den Daten selbst gespeichert? Ich kann mir nicht vorstellen, dass Numpy schweres Heben macht, um int 1zu konvertieren bool True.
BallpointBen
30

onesund zeros, die Arrays voller Einsen bzw. Nullen erstellen, nehmen einen optionalen dtypeParameter an:

>>> 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 unterstützt Monica
quelle
10

Wenn es nicht beschreibbar sein muss, können Sie ein solches Array erstellen mit 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)

Wenn Sie es beschreibbar benötigen, können Sie auch ein leeres Array erstellen und filles selbst:

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

Diese Ansätze sind nur alternative Vorschläge. Im Allgemeinen sollten Sie dabei bleiben np.full, np.zerosoder np.oneswie die anderen Antworten vorschlagen.

MSeifert
quelle
3

Schnell lief eine Zeit, um zu sehen, ob es Unterschiede zwischen der np.fullund np.onesVersion gibt.

Antwort: Nein

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

Ergebnis:

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


WICHTIG

In Bezug auf den Beitrag über np.empty(und ich kann nicht kommentieren, da mein Ruf zu niedrig ist):

TUN SIE DAS NICHT. NICHT VERWENDEN np.empty, um ein All- TrueArray zu initialisieren

Da das Array leer ist, wird der Speicher nicht geschrieben und es gibt keine Garantie dafür, wie hoch Ihre Werte sein werden, z

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]
Joschua
quelle
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 (Größe, Skalarwert, Typ). Es gibt auch andere Argumente, die übergeben werden können. Eine Dokumentation hierzu finden Sie unter https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

nikithashr
quelle
6
Nun, eine andere Antwort wurde bereits mit beantwortet np.full- vor mehr als einem Jahr!
MSeifert