6.16. เส้นโค้งและการอินทิเกรต

หน้าคณิตศาสตร์ครอบคลุมการดำเนินการที่รับอาร์เรย์เข้าและให้อาร์เรย์ (หรือสเกลาร์) ออก ได้แก่ เลขคณิต การลดค่า การบรอดแคสต์ หน้านี้ครอบคลุมการดำเนินการอีกประเภทหนึ่ง: การดำเนินการที่ถือว่าอาร์เรย์เป็น ฟังก์ชันที่สุ่มตัวอย่าง และถามคำถามเกี่ยวกับตัวฟังก์ชัน ได้แก่ การอินเทอร์โพเลตระหว่างตัวอย่าง การฟิตเส้นโค้งให้กับตัวอย่าง การอินทิเกรตใต้เส้นโค้ง และการคอนโวลูชันกับบัฟเฟอร์อื่น

ทั้งหมดนี้รับอินพุต ndarray และคืนค่า float สเกลาร์หรือ ndarray ชนิด float

6.16.1. การอินเทอร์โพเลชัน

interp() ทำการอินเทอร์โพเลชันเชิงเส้นแบบหนึ่งมิติ xp คืออาร์เรย์ 1-D ที่เพิ่มขึ้นแบบ monotonically ของค่าอิสระ fp คือค่าขึ้นอยู่กับที่ตรงกัน และ x คือจุดที่ต้องการประเมินค่า interpolant:

xp = np.array([0.0, 1.0, 2.0, 3.0])
fp = np.array([10.0, 20.0, 25.0, 30.0])
x  = np.array([0.5, 1.5, 2.5])

np.interp(x, xp, fp)
# array([15.0, 22.5, 27.5])

นอกช่วง [xp[0], xp[-1]] ผลลัพธ์จะถูกตัดให้เป็น fp[0] และ fp[-1] ตามลำดับ คีย์เวิร์ด left= และ right= แทนที่ค่าปลายทางเหล่านั้น

ใช้กับกล้องเพื่อแมปตารางการปรับเทียบไปยังตำแหน่งตัวอย่างที่กำหนดเอง เช่น ตารางอุณหภูมิต่อแรงดันไฟจาก thermistor เส้นโค้งการตอบสนองพิกเซลแบบไม่เชิงเส้น หรือการค้นหา gamma ต่อช่อง การเรียกไลบรารีครั้งเดียว ผ่านอินพุตครั้งเดียว ไม่มีลูป Python

6.16.2. การฟิตและประเมินค่าพหุนาม

polyfit() ฟิตพหุนามดีกรี deg กับจุดข้อมูล (x, y) ด้วยวิธีกำลังสองน้อยที่สุดและคืนค่าสัมประสิทธิ์ (ดีกรีสูงสุดก่อน):

x = np.array([0.0, 1.0, 2.0, 3.0, 4.0])
y = np.array([0.0, 1.1, 3.9, 9.1, 15.8])

coeffs = np.polyfit(x, y, 2)
# array([1.0, 0.0, 0.0])  (approximately)

เมื่อละ x ไว้ จะใช้ range(len(y)) แทน ซึ่งมีประโยชน์สำหรับการฟิตพหุนามอย่างรวดเร็วกับบัฟเฟอร์ที่สุ่มตัวอย่างสม่ำเสมอโดยไม่มีแกน x ที่เกี่ยวข้อง:

np.polyfit(y, 2)

polyval() ประเมินพหุนามที่มีสัมประสิทธิ์ p ที่ x อินพุต x อาจเป็นสเกลาร์ (คืน float) หรือ ndarray (คืน ndarray):

p = np.polyfit(x, y, 2)
fitted = np.polyval(p, x)

การจับคู่ที่เป็นธรรมชาติคือเรียก polyfit หนึ่งครั้งในช่วงการปรับเทียบ เก็บสัมประสิทธิ์ไว้ และเรียก polyval เพื่อประเมินเส้นโค้งที่ได้ทุกเฟรม ขั้นตอนการประเมินพหุนามเป็นการดำเนินการ float เพียงไม่กี่ครั้งต่อตัวอย่าง ซึ่งถูกแม้แต่กับกล้องขนาดเล็กที่สุด

6.16.3. การคอนโวลูชัน

convolve() คืนการคอนโวลูชันเชิงเส้นแบบแยกส่วนความยาวเต็มของอาร์เรย์ 1-D สองชุด รองรับเฉพาะโหมด full เท่านั้น ความยาวของเอาต์พุตคือ len(a) + len(v) - 1 ตัดผลลัพธ์เพื่อให้ได้ผลเหมือนโหมด same และ valid ที่ numpy บนเดสก์ท็อปมี:

a = np.array([1.0, 2.0, 3.0])
v = np.array([0.5, 0.5])

np.convolve(a, v)
# array([0.5, 1.5, 2.5, 1.5])

มีประโยชน์สำหรับตัวกรอง FIR สั้นและ smoothing kernels (box, triangle, gaussian) ที่การตั้งค่าเชน SOS เป็นเรื่องเกินความจำเป็น เวลาทำงานเป็นสัดส่วนกับผลคูณของความยาวอาร์เรย์ทั้งสอง ซึ่งเหมาะกับ kernel สั้น แต่จะแพงกว่า FFT convolution อย่างรวดเร็วสำหรับ kernel ยาว

6.16.4. การอินทิเกรตแบบ Trapezoidal

trapz() อินทิเกรตฟังก์ชันที่สุ่มตัวอย่างด้วยกฎ trapezoidal แบบประกอบ:

x = np.linspace(0, np.pi, num=128)
y = np.sin(x)
np.trapz(y, x)             # ~ 2.0

ส่ง dx= เมื่อระยะห่างตัวอย่างสม่ำเสมอและต้องการแค่ขนาดก้าว ส่ง x= เมื่อตัวอย่างไม่ได้เว้นระยะเท่ากัน เหมาะสำหรับการอินทิเกรตข้อมูล sensor ที่บันทึกไว้แล้ว ซึ่งไม่มีรูปแบบเชิงวิเคราะห์

สำหรับข้อมูลตัวอย่างที่ถูก band-limit (เช่น บัฟเฟอร์เสียงหลังตัวกรอง anti-aliasing) กฎ trapezoidal จะลู่เข้าเป็นกำลังสองของจำนวนตัวอย่าง หมายความว่าการเพิ่มความยาวบัฟเฟอร์เป็นสองเท่าจะลดความผิดพลาดลงสี่เท่า

เมื่อ integrand ไม่ใช่บัฟเฟอร์ตัวอย่างแต่เป็นฟังก์ชัน Python ที่แอปพลิเคชันสามารถประเมินได้ที่จุดใดก็ได้ ตระกูลของ solver อื่นจะเป็นตัวเลือกที่เหมาะสมกว่า