Comment créer un tableau numpy de tout vrai ou tout faux?

196

En Python, comment puis-je créer un tableau numpy de forme arbitraire rempli avec tous les vrais ou tous les faux?

Michael Currie
la source

Réponses:

285

numpy permet déjà la création de tableaux de tous les uns ou de tous les zéros très facilement:

par exemple numpy.ones((2, 2))ounumpy.zeros((2, 2))

Puisque Trueet Falsesont représentés en Python comme 1et 0, respectivement, nous n'avons qu'à spécifier que ce tableau doit être booléen en utilisant le dtypeparamètre facultatif et nous avons terminé.

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

Retour:

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

MISE À JOUR: 30 octobre 2013

Depuis la version 1.8 de numpy , nous pouvons utiliser fullpour obtenir le même résultat avec une syntaxe qui montre plus clairement notre intention (comme le souligne fmonegaglia):

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

MISE À JOUR: 16 janvier 2017

Depuis au moins la version numpy 1.12 , fulllance automatiquement les résultats vers dtypele deuxième paramètre, nous pouvons donc simplement écrire:

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

Michael Currie
la source
37
Avez-vous répondu à votre propre question dans la même minute que la question a été publiée?
M4rtini
26
@ M4rtini SO vous permet de publier une question et une réponse à la question simultanément.
Mick MacCallum
1
Le tableau initialisé dtype = int ne peut pas être utilisé pour la sélection des éléments du tableau.
Jichao
1
Cela marche. Cependant, soyez prudent car comme le dit @Jichao, a=np.ones((2,2))suivi de a.dtype=boolne fonctionne PAS.
medley56
8
Maintenant un meme célèbre: devhumor.com/media
...
93
numpy.full((2,2), True, dtype=bool)
fmonegaglia
la source
12
+1 Je pense que cela devrait être la réponse acceptée. Il semble plus naturel de remplir un tableau de booléens que de le remplir de nombres pour les convertir en booléens.
Zelphir Kaltstahl
5
Les réponses oneset zerosne construisent pas un tableau d'entiers. Ils construisent directement un tableau de booléens.
user2357112 prend en charge Monica le
1
Est-ce numpy.full((2,2), True)un équivalent?
Pavel
C'est dans numpy 1.12+. Je ne me souviens pas si cela s'applique aux anciennes versions non plus
fmonegaglia
Surly dtype est stocké séparément des données elles-mêmes lorsque cela est possible? Je ne peux imaginer numpy faire soulever des objets lourds pour convertir int 1à bool True.
BallpointBen
30

oneset zeros, qui créent des tableaux remplis respectivement de uns et de zéros, prennent un dtypeparamètre facultatif :

>>> 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 prend en charge Monica
la source
10

S'il n'a pas besoin d'être accessible en écriture, vous pouvez créer un tel tableau avec 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)

Si vous en avez besoin, vous pouvez également créer un tableau vide et le créer fillvous-même:

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

Ces approches ne sont que des suggestions alternatives. En général, vous devriez vous en tenir à np.full, np.zerosou np.onescomme le suggèrent les autres réponses.

MSeifert
la source
3

Exécuté rapidement un timeit pour voir s'il y a des différences entre la version np.fullet np.ones.

Réponse: non

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

Résultat:

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


IMPORTANT

Concernant le post sur np.empty(et je ne peux pas commenter, car ma réputation est trop basse):

NE FAITES PAS CELA. NE PAS UTILISER np.emptypour initialiser un Truetableau complet

Comme le tableau est vide, la mémoire n'est pas écrite et il n'y a aucune garantie, quelles seront vos valeurs, par exemple

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]
Joschua
la source
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 (taille, valeur scalaire, type). Il existe également d'autres arguments qui peuvent être passés, pour la documentation à ce sujet, consultez https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

nikithashr
la source
6
Eh bien, une autre réponse a déjà répondu en utilisant np.full- il y a plus d'un an!
MSeifert
0

référence pour la réponse de Michael Currie

import perfplot

bench_x = perfplot.bench(
    n_range= range(1, 200),
    setup  = lambda n: (n, n),
    kernels= [
        lambda shape: np.ones(shape, dtype= bool),
        lambda shape: np.full(shape, True)
    ],
    labels = ['ones', 'full']
)

bench_x.show()

entrez la description de l'image ici

Hammad
la source