Tôi có một mảng giá trị khổng lồ của các giá trị vô hướng 3D (OK gọi nó là "âm lượng" nếu bạn phải). Tôi muốn nội suy một trường vô hướng trơn tru trong trường hợp này với sự kế thừa của bất thường, không phải tất cả các tọa độ xyz không được tích hợp phía trước được biết đến trước đây là .Làm thế nào để có được gradient của một nội suy scipy trực tiếp?
hỗ trợBây giờ scipy cho đây chỉ là tuyệt vời: Tôi lọc âm lượng với
filtered_volume = scipy.ndimage.interpolation.spline_filter(volume)
và gọi
scipy.ndimage.interpolation.map_coordinates(
filtered_volume,
[[z],[y],[x]],
prefilter=False)
cho (x, y, z) quan tâm để có được vẻ độc đáo cư xử (mịn, vv) các giá trị nội suy.
Cho đến nay rất tốt. Tuy nhiên, ứng dụng của tôi cũng cần các dẫn xuất cục bộ của trường nội suy. Hiện tại tôi có được những điểm khác biệt trung tâm này: Tôi cũng lấy mẫu ở mức 6 điểm bổ sung (điều này ít nhất có thể được thực hiện chỉ với một cuộc gọi đến map_coordinates
) và tính toán ví dụ: x phái sinh từ (i(x+h,y,z)-i(x-h,y,z))/(2*h)
. (Có, tôi biết tôi có thể giảm số lượng vòi bổ sung xuống 3 và làm "một mặt" khác biệt, nhưng sự bất đối xứng sẽ làm phiền tôi.)
Bản năng của tôi là phải có cách trực tiếp hơn để lấy gradient nhưng tôi không biết đủ toán học spline (chưa) để tìm ra, hoặc hiểu những gì xảy ra trong sự can đảm của việc thực hiện Scipy: scipy/scipy/ndimage/src/ni_interpolation.c
.
Có cách nào tốt hơn để có được gradient của tôi "trực tiếp hơn" hơn sự khác biệt trung tâm? Tốt nhất là cho phép chúng thu được bằng cách sử dụng chức năng hiện có thay vì tấn công vào các bộ phận bên trong của Sciper.
Câu hỏi tuyệt vời! Tôi nghĩ rằng nó nên được khá thẳng về phía trước để có được gradient từ các hệ số spline trong 'lọc_volume', nhưng tôi sợ tôi không có bất kỳ ý tưởng tốt hơn về chính xác như thế nào hơn bạn ... Bạn có thể muốn hỏi trên danh sách gửi thư scipy, là tốt. –