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
Mı 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.