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 ภายใน) เหมาะสำหรับความสะดวกในการเขียนโค้ด ไม่ใช่ประสิทธิภาพ