Tüm True veya all False gibi bir numpy dizisi nasıl oluşturulur?


Yanıtlar:


284

numpy zaten hepsinin veya tüm sıfırların dizilerinin kolayca oluşturulmasına izin veriyor:

örneğin numpy.ones((2, 2))veyanumpy.zeros((2, 2))

Yana Trueve Falsesıra Python temsil edilir 1ve 0sırasıyla biz opsiyonel kullanarak boole olmalıdır bu diziyi belirtmek için sadece var dtypeparametreyi ve işlem tamamdır.

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

İadeler:

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

GÜNCELLEME: 30 Ekim 2013

Numpy sürüm 1.8'den bu yana , fullniyetimizi daha net bir şekilde gösteren sözdizimi ile aynı sonucu elde etmek için kullanabiliriz (fmonegaglia'nın belirttiği gibi):

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

GÜNCELLEME: 16 Ocak 2017

En az numpy sürüm 1.12 olduğundan , fullsonuçları dtypeikinci parametreye otomatik olarak verir , böylece şunu yazabiliriz:

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


37
Kendi sorunuzu, sorunun gönderildiği dakika içinde cevapladınız mı?
M4rtini

26
@ M4rtini SO, aynı anda hem soru hem de soruya cevap göndermenizi sağlar.
Mick MacCallum

1
dtype = int başlatılmış dizi, dizi öğesi seçimi için kullanılamaz.
Jichao

1
Bu çalışıyor. Ancak dikkatli olun, çünkü @Jichao'nun dediği gibi a=np.ones((2,2))onu takip a.dtype=boolETMEZ.
medley56

8
Şimdi ünlü bir meme: devhumor.com/media/…
WLGfx

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

12
+1 Bence bu kabul edilen cevap olmalı. Bir diziyi bools ile doldurmak, onları boole dökmek için sayılarla doldurmak daha doğal görünmektedir.
Zelphir Kaltstahl

5
onesVe zeroscevaplar Sayı dizisi inşa yoktur. Doğrudan bir dizi bools inşa ediyorlar.
user2357112 Monica

1
numpy.full((2,2), True)eşdeğer?
Pavel

Nümerik 1.12+. Eski sürümler için de geçerli olup olmadığını hatırlamıyorum
fmonegaglia

Somurtkan dtype mümkün olduğunda verilerin kendisinden ayrı olarak saklanır mı? Numpy'nin dönüştürmek int 1için ağır bir kaldırma yaptığını hayal edemiyorum bool True.
Tükenmez Kalem

30

ones ve zeros sırasıyla bunlarla ve sıfırlarla dolu diziler oluşturan isteğe bağlı bir dtypeparametre alır:

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

Yazılabilir olması gerekmiyorsa, böyle bir dizi oluşturabilirsiniz 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)

Yazılabilir olması gerekiyorsa, boş bir dizi ve fillkendiniz de oluşturabilirsiniz :

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

Bu yaklaşımlar sadece alternatif önerilerdir. Genel olarak sopa ile gereken np.full, np.zerosya da np.onesdiğer cevaplar önermek gibi.


3

np.fullVe arasında herhangi bir fark varsa hızlıca bir timeit koştunp.ones sürümü .

Yanıt: Hayır

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

Sonuç:

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


ÖNEMLİ

Hakkında yazı hakkında np.empty(ve itibarım çok düşük olduğu için yorum yapamam):

BUNU YAPMAYIN. Tüm diziyi np.emptybaşlatmak için KULLANMAYINTrue

Dizi boş olduğundan, bellek yazılmaz ve garanti yoktur, değerlerinizin ne olacağı, ör.

>>> print(np.empty((4,4), dtype=bool))
[[ True  True  True  True]
 [ True  True  True  True]
 [ True  True  True  True]
 [ True  True False False]]


0

Michael Currie'nin cevabı için kıyaslama

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

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.