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


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)


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)

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)

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.


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


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.