เคล็ดลับสำหรับการเล่นกอล์ฟแบบ numpy, scipy หรือ pylab


10

แล้วมีรายการที่ครอบคลุมของเคล็ดลับสำหรับการหลามที่นี่ดังนั้นสิ่งที่ฉันขอเป็นเคล็ดลับที่เฉพาะนำไปใช้กับการใช้numpy, scipyหรือpylabห้องสมุด

สิ่งเหล่านี้อาจเป็นวิธีการย่อรหัสที่ใช้ไปแล้วnumpyหรือวิธีการลดขนาดการดำเนินการของงูใหญ่โดยใช้ไลบรารีเหล่านี้

กรุณาหนึ่งเคล็ดลับต่อคำตอบ


โปรดทราบว่าpylabเป็นเพียงmatplotlib.pyplot+ numpyในเนมสเปซทั่วไปที่เลิกใช้แล้ว numpyส่วนหนึ่งของการpylabเป็นเล็กน้อยในแง่ที่ว่าการนำเข้าของพวกเขามีหมายเลขเดียวกันของไบต์ดังนั้นสิ่งเดียวที่วางแผน additionaly อาจจะมาจากpylabแต่ผมสงสัยว่าไม่ใช่สิ่งที่คุณมีอยู่ในใจกับคำถามของคุณ
Andras Deak

2
@AndrasDeak ฉันทราบดีว่าการใช้ pylab นั้นถือว่าเป็นการปฏิบัติที่ไม่ดี แต่ codegolf น้อยมากก็ถือว่าเป็นแนวปฏิบัติที่ดี Pylab โดยตรงรวมถึงบางส่วนของnumpyแพคเกจมากมาย ตัวอย่างที่ถูกต้องที่จะต้องpylab.randint numpy numpy.random.randintดังนั้นสำหรับการเล่นกอล์ฟpylabควรให้รหัสที่สั้นกว่า
2699

1
ฉันรู้ว่าการคัดค้านไม่ใช่ปัญหาประเด็นของฉันคือว่ามันไม่ได้ให้ประโยชน์ ฉันไม่ได้ตระหนักว่าแพ็คเก็จย่อยก็ถูกโหลดลงใน pylab namespace เช่นนั้น! ขออภัยคุณพูดถูกแล้ว :)
Andras Deak

คำตอบ:


5

ใช้ประโยชน์จากการกระจายเสียงของ Numpy

Broadcasting หมายถึงการจำลองอาร์เรย์หลายมิติพร้อมกับมิติเดี่ยวของมันเพื่อให้ตรงกับขนาดของอาร์เรย์อื่น สิ่งนี้จะเกิดขึ้นโดยอัตโนมัติสำหรับอาร์เรย์ Numpy เมื่อมีการใช้ตัวดำเนินการทางคณิตศาสตร์กับพวกมัน

ตัวอย่างเช่นในการสร้างตารางการคูณ 10 × 10 คุณสามารถใช้

import numpy
t=numpy.arange(1,11)
print(t*t[:,None]) # Or replace t[:,None] by [*zip(t)]

ลองออนไลน์!

ที่นี่ถูกสร้างขึ้นเป็นอาร์เรย์t Numpy [1, 2, ..., 10]มีรูปร่าง (10,) ซึ่งเทียบเท่ากับ (1,10) อาร์เรย์ตัวถูกดำเนินการอื่นt[:,None]มีขนาด (10,1) การคูณสองอาร์เรย์โดยปริยายทำซ้ำดังนั้นพวกมันจึงทำงานราวกับว่าพวกเขาทั้งสองมีรูปร่าง (10,10) ผลลัพธ์ซึ่งมีรูปร่าง (10,10) มีผลิตภัณฑ์สำหรับรายการทั้งหมดในอาร์เรย์ต้นฉบับ


นั่นเป็นการใช้งานที่ชาญฉลาดzipกับการแพร่ภาพกระจายเสียงนั่นจะเกิดขึ้นในคำตอบของตัวเองหรือไม่?
user2699

@ user2699 ผมไม่คิดว่ามันคุ้มค่าคำตอบที่แยกจากกันเพราะมีการนับไบต์เช่นเดียวกับการอ่านมากขึ้น[*zip(t)] t[:,None]แต่คุณพูดถูกมันอาจจะคุ้มค่าที่จะสังเกตดังนั้นฉันจึงเพิ่มมันกลับมาที่นี่
หลุยส์เมนโด

จุดดีฉันคิดว่าฉันไม่ได้นับจำนวนไบต์จริงๆ [*zip(t)]จะสั้นลงสองไบต์หากมีขนาดเพิ่มเติม
2699

1
โปรดทราบว่าการขยายไฟล์ที่เปิดซ้ำออกมาซ้ำแล้วซ้ำอีก[*zip(t)]จะทำงานบน python 3 เท่านั้น
Andras Deak

ฉันดูหน้านี้ในขณะที่ฉันสนใจที่จะค้นหาว่ามีอะไรบ้างที่ Perl 6 ไม่มี อย่างไรก็ตามจะมีการเขียนเป็นmy \t = 1..10; .fmt('%3d').put for t «*» t[*,Empty]หรือคุณสามารถใช้zip(t)
แบรดกิลเบิร์ต b2gills

2

ใช้ r _ [... ] แทนช่วง (... )

Numpy ให้ MATLAB r_[...]เช่นไวยากรณ์สำหรับการสร้างอาร์เรย์ใช้ สัญกรณ์ชิ้นใด ๆ ในระหว่างวงเล็บจะถูกตีความว่าเป็นอาร์เรย์ที่มีช่วงที่ระบุ ตัวอย่างเช่น

r_[:30:4]

เทียบเท่ากับ

arange(0,30,4)

และสำหรับการใช้งานส่วนใหญ่สามารถแทนที่

range(0,30 4)

นอกจากนี้ยังสามารถจัดการกับการแสดงออกที่ซับซ้อนมากขึ้น ตัวอย่างเช่นการรับดัชนีตั้งแต่ 0 ถึง 10 และกลับลงมาอีกครั้ง

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