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


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)


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)

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)

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.


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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.