Hướng dẫn 2d natural neighbor interpolation python - python nội suy hàng xóm tự nhiên 2d

Nội suy Sibson (hàng xóm tự nhiên) rời rạc

Nội suy hàng xóm tự nhiên là một phương pháp để nội suy dữ liệu phân tán (nghĩa là bạn biết các giá trị của một hàm tại các vị trí phân tán). Nó thường vượt trội so với nội suy barycentric tuyến tính, đây là một phương pháp nội suy thường được sử dụng được cung cấp bởi chức năng scipy tựa griddata.

Có một số triển khai nội suy hàng xóm tự nhiên 2D trong Python. Chúng tôi cần một triển khai 3D nhanh có thể chạy mà không cần GPU, vì vậy chúng tôi đã viết một triển khai nội suy SIBSON rời rạc (một phiên bản nội suy hàng xóm tự nhiên nhanh nhưng đưa ra các lỗi nhỏ so với nội suy hàng xóm tự nhiên hình học).

Xem https://doi.org/10.1109/tvcg.2006.27 để biết chi tiết.

Phụ thuộc

  • Python 2.7 hoặc 3,4+

  • Numpy (đã được thử nghiệm với 1.13+)

Trình diễn

Nội suy hàng xóm tự nhiên có thể chính xác hơn so với phép nội suy barycentric tuyến tính (mặc định của SCIPY) cho các chức năng thay đổi trơn tru.

Ngoài ra, kết quả cuối cùng có vẻ tốt hơn.

Hướng dẫn 2d natural neighbor interpolation python - python nội suy hàng xóm tự nhiên 2d

Lưu ý rằng các giá trị hàng xóm tự nhiên thường được ngoại suy; Họ đã bị cắt trong bản demo để so sánh khá với phương pháp barycentric tuyến tính của Scipy, không ngoại suy.

Cách sử dụng

Mô -đun này hiển thị một hàm duy nhất, griddata.

API cho naturalneighbor.griddata tương tự như scipy.interpolate.griddata. Không giống như Scipy, đối số thứ ba không phải là một MGRID dày đặc, mà thay vào đó chỉ là những phạm vi sẽ được chuyển đến mgrid. Điều này là do phương pháp Sibson rời rạc đòi hỏi các điểm nội suy nằm trên lưới cách đều nhau.

import scipy.interpolate
import numpy as np

import naturalneighbor

num_points = 10
num_dimensions = 3
points = np.random.rand(num_points, num_dimensions)
values = np.random.rand(num_points)

grids = tuple(np.mgrid[0:100:1, 0:50:100j, 0:100:2])
scipy_interpolated_values = scipy.interpolate.griddata(points, values, grids)

grid_ranges = [[0, 100, 1], [0, 50, 100j], [0, 100, 2]]
nn_interpolated_values = naturalneighbor.griddata(points, values, grid_ranges)

Công việc tương lai

  • Cung cấp các tùy chọn để xử lý ngoại suy

  • Hỗ trợ phao và số phức (chỉ hỗ trợ nhân đôi tại thời điểm này)

  • Hỗ trợ 2D (chỉ hỗ trợ 3D)

  • Thêm tài liệu với thảo luận về những hạn chế của phương pháp Sibson rời rạc

  • Unmment Cpplint từ Tox.ini và Cleanup C ++ mã

  • Tổng quát hóa mô hình luồng (hiện tại nó sử dụng 8 luồng một cho mỗi góc phần tư)