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.