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

193

Dengan Python, bagaimana cara membuat array numpy dengan bentuk acak yang diisi dengan semua Benar atau semua Salah?

Michael Currie
sumber

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)

Michael Currie
sumber
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)
fmonegaglia
sumber
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)
user2357112 mendukung Monica
sumber
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.

MSeifert
sumber
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]]
Joschua
sumber
0
>>> a = numpy.full((2,4), True, dtype=bool)
>>> a[1][3]
True
>>> a
array([[ True,  True,  True,  True],
       [ True,  True,  True,  True]], dtype=bool)

numpy.full (Ukuran, Nilai Skalar, Jenis). Ada juga argumen lain yang dapat diajukan, untuk dokumentasi tentang itu, periksa https://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html

nikithashr
sumber
6
Nah, jawaban lain sudah dijawab menggunakan np.full- lebih dari satu tahun yang lalu!
MSeifert