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.