วิธีสร้างอาร์เรย์ที่มีค่าเป็น True หรือ False ทั้งหมด?


195

ใน Python ฉันจะสร้างอาร์เรย์ที่มีรูปร่างตามอำเภอใจซึ่งเต็มไปด้วย True จริงหรือเท็จทั้งหมดได้อย่างไร

คำตอบ:


284

numpy อนุญาตให้สร้างอาร์เรย์ของทุกคนหรือศูนย์ทั้งหมดได้อย่างง่ายดายมาก:

เช่นnumpy.ones((2, 2))หรือnumpy.zeros((2, 2))

เนื่องจากTrueและFalseมีการแสดงใน Python เป็น1และ0ตามลำดับเรามีเพียงเพื่อระบุอาร์เรย์นี้ควรเป็นบูลีนโดยใช้dtypeพารามิเตอร์ตัวเลือกและเราจะทำ

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

ผลตอบแทน:

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

อัปเดต: 30 ตุลาคม 2556

ตั้งแต่รุ่น numpy 1.8เราสามารถใช้fullเพื่อให้ได้ผลลัพธ์เดียวกันด้วยไวยากรณ์ที่แสดงเจตนาของเราได้ชัดเจนขึ้น (ดังที่ fmonegaglia ชี้ให้เห็น):

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

อัปเดต: 16 มกราคม 2560

เพราะอย่างน้อย numpy รุ่น 1.12 , fullปลดเปลื้องโดยอัตโนมัติผลไปdtypeของพารามิเตอร์ที่สองเพื่อให้เราสามารถเขียน:

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


37
คุณตอบคำถามของคุณเองในนาทีเดียวกับคำถามที่โพสต์หรือไม่
M4rtini

26
@ M4rtini SO ช่วยให้คุณสามารถโพสต์คำถามและตอบคำถามพร้อมกัน
Mick MacCallum

1
dtype = int ไม่สามารถใช้อาร์เรย์เริ่มต้นได้สำหรับการเลือกองค์ประกอบอาร์เรย์
Jichao

1
วิธีนี้ใช้ได้ผล อย่างไรก็ตามโปรดระวังเพราะอย่างที่ @Jaoao พูดแล้วa=np.ones((2,2))ตามด้วยa.dtype=boolไม่ทำงาน
medley56

8
ตอนนี้ meme ที่มีชื่อเสียง: devhumor.com/media/…
WLGfx

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

12
+1 ฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้ ดูเหมือนว่าเป็นเรื่องเป็นธรรมชาติมากกว่าที่จะเติมอาร์เรย์ด้วย bools แทนที่จะเติมด้วยตัวเลขเพื่อใช้เป็นคนโง่
Zelphir Kaltstahl

5
onesและzerosคำตอบไม่ได้สร้างอาร์เรย์ของจำนวนเต็ม พวกเขาสร้างอาร์เรย์ของคนโง่โดยตรง
user2357112 รองรับ Monica

1
คือnumpy.full((2,2), True)เทียบเท่า?
Pavel

มันอยู่ในจำนวน 1.12+ ฉันจำไม่ได้ว่ามันใช้กับเวอร์ชั่นเก่าหรือไม่
fmonegaglia

แน่นอน dtype จะถูกจัดเก็บแยกต่างหากจากข้อมูลของตัวเองเมื่อเป็นไปได้? ฉันไม่สามารถจินตนาการ numpy ทำยกของหนักใด ๆ ที่จะแปลงไปint 1 bool True
BallpointBen

30

onesและzerosซึ่งสร้างอาร์เรย์ที่เต็มไปด้วยคนและศูนย์ตามลำดับใช้dtypeพารามิเตอร์ตัวเลือก:

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

หากไม่จำเป็นต้องเขียนคุณสามารถสร้างอาร์เรย์ดังกล่าวได้ด้วย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)

หากคุณต้องการเขียนได้คุณสามารถสร้างอาเรย์ที่ว่างเปล่าและสร้างfillมันเอง:

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

แนวทางเหล่านี้เป็นเพียงคำแนะนำทางเลือก โดยทั่วไปคุณควรติดกับnp.full, np.zerosหรือnp.onesต้องการคำตอบอื่น ๆ แนะนำ


3

รีบวิ่ง timeit เพื่อดูถ้ามีความแตกต่างใด ๆ ระหว่างnp.fullและnp.onesรุ่น

คำตอบ: ไม่

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

ผลลัพธ์:

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


สำคัญ

เกี่ยวกับโพสต์เกี่ยวกับnp.empty(และฉันไม่สามารถแสดงความคิดเห็นได้เนื่องจากชื่อเสียงของฉันต่ำเกินไป):

อย่าทำอย่างนั้น อย่าใช้np.emptyเพื่อเริ่มต้นTrueอาร์เรย์ทั้งหมด

เนื่องจากอาร์เรย์ว่างเปล่าหน่วยความจำจะไม่ถูกเขียนและไม่มีการรับประกันว่าค่าของคุณจะเป็นเช่นไร

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

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 (ขนาด, ค่าสเกลาร์, ประเภท) มีข้อโต้แย้งอื่น ๆ เช่นกันที่สามารถส่งผ่านได้สำหรับเอกสารเกี่ยวกับเรื่องนั้นให้ตรวจสอบhttps://docs.scipy.org/doc/numpy/reference/generated/numpy.full.html


6
ดีคำตอบอื่นแล้วตอบโดยใช้np.full- มากกว่าหนึ่งปีที่แล้ว!
MSeifert

0

มาตรฐานสำหรับคำตอบของ Michael Currie

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

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.