Bagaimana cara membuat array numpy dari semua Benar atau semua Salah?


Jawaban:


281

numpy sudah memungkinkan pembuatan array semua atau semua nol dengan sangat mudah:

misalnya numpy.ones((2, 2))ataunumpy.zeros((2, 2))

Karena Truedan Falsediwakili dalam Python sebagai 1dan 0, masing-masing, kita hanya perlu menentukan array ini harus boolean menggunakan dtypeparameter opsional dan kita selesai.

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

pengembalian:

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

PEMBARUAN: 30 Oktober 2013

Sejak numpy versi 1.8 , kita dapat menggunakan fulluntuk mencapai hasil yang sama dengan sintaks yang lebih jelas menunjukkan niat kita (seperti yang ditunjukkan fmonegaglia):

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

PEMBARUAN: 16 Januari 2017

Karena setidaknya numpy versi 1.12 , fullsecara otomatis melemparkan hasil ke dtypeparameter kedua, jadi kita bisa menulis:

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


37
Apakah Anda menjawab pertanyaan Anda sendiri pada menit yang sama dengan pertanyaan yang diposting?
— M4rtini

26
@M4rtini SO memungkinkan Anda memposting pertanyaan dan jawaban untuk pertanyaan secara bersamaan.
— Mick MacCallum

1
dtype = int array yang diinisialisasi tidak dapat digunakan untuk pemilihan elemen array.
— Jichao

1
Ini bekerja. Namun, berhati-hatilah karena seperti yang dikatakan @Jichao, a=np.ones((2,2))diikuti dengan a.dtype=boolTIDAK bekerja.
— medley56

8
Sekarang meme yang terkenal: devhumor.com/media/…
— WLGfx

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

12
+1 Saya pikir ini harus menjadi jawaban yang diterima. Tampaknya lebih alami untuk mengisi array dengan bools, daripada mengisinya dengan angka untuk melemparkannya ke bools.
— Zelphir Kaltstahl

5
Jawaban onesdan zerostidak membangun array bilangan bulat. Mereka membangun array bools secara langsung.
— user2357112 mendukung Monica

1
Apakah numpy.full((2,2), True)setara?
— Pavel

Ini dalam 1,12+ numpy. Saya tidak ingat apakah itu berlaku untuk versi sebelumnya juga
— fmonegaglia

Tentunya dtype disimpan secara terpisah dari data itu sendiri jika memungkinkan? Aku tidak bisa membayangkan numpy melakukan apapun angkat berat untuk mengkonversi int 1ke bool True.
— BallpointBen

30

onesdan zeros, yang masing-masing membuat array penuh satu dan nol, ambil dtypeparameter opsional :

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

Jika tidak harus dapat ditulisi, Anda dapat membuat array dengan 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)

Jika Anda membutuhkannya dapat ditulisi, Anda juga dapat membuat array kosong dan fillitu sendiri:

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

Pendekatan-pendekatan ini hanyalah saran alternatif. Secara umum Anda harus tetap dengan np.full, np.zerosatau np.onesseperti yang disarankan jawaban lain.


3

Cepat jalankan timeit untuk melihat, jika ada perbedaan antara versi np.fulldan np.ones.

Jawab: Tidak

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

Hasil:

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


PENTING

Mengenai pos tentang np.empty(dan saya tidak dapat berkomentar, karena reputasi saya terlalu rendah):

JANGAN LAKUKAN ITU. JANGAN GUNAKAN np.emptyuntuk menginisialisasi semua- Truearray

Karena array kosong, memori tidak ditulis dan tidak ada jaminan, seperti apa nilai Anda, misalnya

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.