ใน Python ฉันจะสร้างอาร์เรย์ที่มีรูปร่างตามอำเภอใจซึ่งเต็มไปด้วย True จริงหรือเท็จทั้งหมดได้อย่างไร
ใน Python ฉันจะสร้างอาร์เรย์ที่มีรูปร่างตามอำเภอใจซึ่งเต็มไปด้วย True จริงหรือเท็จทั้งหมดได้อย่างไร
คำตอบ:
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)
a=np.ones((2,2))
ตามด้วยa.dtype=bool
ไม่ทำงาน
numpy.full((2,2), True, dtype=bool)
ones
และzeros
คำตอบไม่ได้สร้างอาร์เรย์ของจำนวนเต็ม พวกเขาสร้างอาร์เรย์ของคนโง่โดยตรง
numpy.full((2,2), True)
เทียบเท่า?
int 1
bool True
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)
หากไม่จำเป็นต้องเขียนคุณสามารถสร้างอาร์เรย์ดังกล่าวได้ด้วย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
ต้องการคำตอบอื่น ๆ แนะนำ
รีบวิ่ง 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]]
>>> 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
มาตรฐานสำหรับคำตอบของ 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()