Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

วิธีใช้ฟังก์ชันกับ Meshgrid ใน Python NumPy

Meshgrid ใช้สร้างเมทริกซ์พิกัดจากเวกเตอร์พิกัด (coordinate vectors) ใน NumPy การนำฟังก์ชันไปประยุกต์กับ meshgrid สามารถทำได้โดยใช้ @np.vectorize เดอเรเตอร์ เพื่อให้ฟังก์ชันทำงานแบบ element-wise กับอาร์เรย์

ตัวอย่างโค้ด

import numpy as np

@np.vectorize
def foo(a, b):
    return a + b

x = [0.0, 0.5, 1.0]
y = [0.0, 1.0, 8.0]

print("Function Output:", foo(x, y))

ผลลัพธ์

Function Output: [0.  1.5 9. ]

คำอธิบาย

  • @np.vectorize ทำให้ฟังก์ชัน foo รับอาร์เรย์ได้ และคืนค่าอาร์เรย์ผลลัพธ์
  • การทำงาน: foo([0, 0.5, 1], [0, 1, 8]) → [0+0, 0.5+1, 1+8] = [0, 1.5, 9]
  • เหมือนการทำ np.add(x, y) แต่ใช้ฟังก์ชันที่กำหนดเอง

การใช้กับ Meshgrid จริง


import numpy as np

x = np.linspace(-2, 2, 5)
y = np.linspace(-2, 2, 5)
X, Y = np.meshgrid(x, y)

@np.vectorize
def my_func(x, y):
    return np.sin(x) * np.cos(y)

Z = my_func(X, Y)
print(Z.shape)  # (5, 5)

ทางเลือกที่ดีกว่า: ใช้ Universal Functions (ufunc)

NumPy มี ufunc ในตัวที่เร็วกว่า np.vectorize มาก:

  • np.sin(X) * np.cos(Y) - ทำงานโดยตรงกับอาร์เรย์ 2 มิติ
  • np.sqrt(X**2 + Y**2) - ระยะห่างจากจุดกำเนิด
  • np.exp(-(X**2 + Y**2)) - Gaussian 2D

เมื่อควรใช้ np.vectorize

  • ฟังก์ชันที่ซับซ้อน ไม่สามารถเขียนในรูป ufunc ได้ง่าย
  • ฟังก์ชันที่มีเงื่อนไข (if/else) ภายใน
  • การทดสอบโปรโตไทป์ ก่อนจะเขียน ufunc แบบ C/Numba

ข้อควรระวัง

np.vectorize ไม่ได้เพิ่มความเร็ว (ยังเป็นลูป Python ภายใน) เหมาะสำหรับความสะดวกในการเขียนโค้ด ไม่ใช่ประสิทธิภาพ