Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

Tôi có vấn đề với nội suy các điểm dữ liệu 3D trong Python. Tôi có cấu trúc dữ liệu đơn giản như thế này:

class Point( object ):
def __init__( self, x, y, z, data ):
    self.x, self.y, self.z = x, y, z
    self.data = data

X, Y, Z là tọa độ trong không gian 3D Cartesian, dữ liệu là giá trị vô hướng tại thời điểm này.

Tôi đã thử phương pháp được hiển thị ở đây: Nội suy/Subpling của dữ liệu 3D trong Python không có VTK, nhưng tôi có vấn đề để nó hoạt động chính xác.

Bạn có thể nội suy hai trục một cách độc lập như:

Mã số

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y

Mã kiểm tra:

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))

Results:

(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)

scipy.interpolate.interp(1D, 2D, 3D)

Trong bài viết này, chúng tôi sẽ khám phá cách thực hiện phép nội suy trong Python, sử dụng thư viện SCIPY.

SCIPY cung cấp rất nhiều chức năng hữu ích cho phép xử lý toán học và tối ưu hóa phân tích dữ liệu. Cụ thể hơn, nói về dữ liệu nội suy, nó cung cấp một số chức năng hữu ích để có được phép nội suy nhanh chóng và chính xác, bắt đầu từ một tập hợp các điểm dữ liệu đã biết. Trong văn bản sau, chúng tôi sẽ phân tích ba kịch bản nội suy khác nhau; nội suy một chiều nội suy hai và ba chiều.mathematical processing and optimization of the data analysis. More specifically, speaking about interpolating data, it provides some useful functions for obtaining a rapid and accurate interpolation, starting from a set of known data points. In the following text, we will analyze three different interpolation scenarios; one-dimensional interpolation two and three-dimensional interpolation.

Các chức năng sẽ được sử dụng trong đoạn mã được lấy từ thư viện

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
8 và lần lượt là:
def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
9,
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
0 và
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
1.

Nội suy gì?

Từ quan điểm toán học, phép nội suy cho biết quá trình thu được giá trị của các điểm dữ liệu chưa biết cụ thể nằm giữa một số điểm dữ liệu đã biết khác, sau khi đã mô tả tập hợp các điểm dữ liệu đã biết với hàm cơ hội.

Ví dụ: nếu chúng ta có một loạt các điểm dữ liệu x0, x1, x2, thì xn xn và chúng ta biết các giá trị y0, y1, y2, Hồi yn (với yn = f (xn)), thông qua quá trình nội suy, chúng ta có thể Xác định giá trị ym = f (xm), trong đó xm là một điểm nằm ở giữa hai trong số các điểm đã biết, tức là & nbsp; Khi x0

Các đoạn sau giải thích cách thực hiện phép nội suy khi xử lý các bộ dữ liệu 1, 2 hoặc 3 chiều. Để làm điều đó, chúng tôi sẽ dựa vào thư viện Python Scipy, cụ thể hơn vào một trong các gói của nó được gọi là

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
2 cung cấp chức năng
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
3 để thực hiện một cách dễ dàng và ngay lập tức nhiệm vụ này.

Nội suy 1D

Hãy bắt đầu bằng cách đầu tiên nhập chức năng sẽ được sử dụng để thực hiện phép nội suy.

Như đã được giới thiệu, chức năng được gọi là

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
4) và thuộc gói SCIPY. Vì chúng tôi sẽ sử dụng các chức năng nội suy khác nhau cho từng kích thước (tất cả chúng thuộc về
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
5), chúng tôi sẽ chỉ nhập
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
5 từ thư viện SCIPY. Trước hết, chúng ta cần tạo một tập dữ liệu sẽ được sử dụng để hiển thị quá trình nội suy. Chúng tôi sẽ làm điều này, xác định một mảng X (sử dụng hàm numpy
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
7) trong số mười số cách đều nhau, dao động từ 0 đến 100. Mảng y, thay vào đó, sẽ được xác định bởi phương trình sau:

Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

import numpy as np
import matplotlib.pyplot as plt
from scipy import interpolate

#defining x and y arrays of the initial data set
x = np.linspace(0, 100,10)
y = 3*x**2 – np.exp(0.1*x)

Vì quá trình nội suy cho phép thu được giá trị của các điểm chưa biết nằm trong phạm vi của các điểm đã được biết đến, giờ đây chúng tôi xác định một mảng X khác sẽ chứa nhiều điểm hơn mảng X đầu tiên (X X X). Cụ thể, chúng tôi khai thác lại

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
7 để xây dựng một mảng gồm 100 số cách đều nhau. Sau đó, chúng tôi gọi đây là mảng này là x_new.

# x array that will be used for interpolating new point values
x_new = np.linspace(0, 100, 100)

Tại thời điểm này, chúng tôi đã có thể nội suy tập dữ liệu ban đầu của mình và thu được các giá trị của các điểm mới, mà chúng tôi đã lưu trữ trong mảng X_New. Để làm điều đó, chúng tôi khai thác hàm

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
9; trong đó lấy đầu vào bắt buộc, các mảng X và Y trong đó được lưu trữ các giá trị của các điểm dữ liệu đã biết và trả về dưới dạng hàm nội suy mà sau đó chúng ta có thể thu được các giá trị của các điểm chưa biết. Một đầu vào tùy chọn khác nhưng rất quan trọng có thể được chỉ định cho hàm
def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
9 là loại loại, chỉ định loại chức năng sẽ được sử dụng trong quá trình nội suy. Có nhiều tùy chọn loại hình của người Viking, chúng là:

kind = ['linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next']

Được sử dụng rộng rãi nhất là

(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
1,
(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
2,
(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
3 và
(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
4, trong đó đề cập đến phép nội suy spline của Zeroth, thứ nhất, thứ hai hoặc thứ ba, tương ứng.
(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
5 và
(174269.53842923077, 608480.2517169231)
(174269.78004461539, 608472.5631784615)

(174267.92426830987, 608531.6163683098)
6 Chỉ cần trả lại giá trị trước hoặc tiếp theo của điểm (vui lòng tham khảo https://docs.scipy.org/doc/scipy/reference/generated/scipy.Interpolate.interp1d.html để biết tài liệu hoàn chỉnh trên
def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
9).

Để xem tất cả các chức năng nội suy khác nhau được vẽ cùng nhau, chúng ta có thể khai thác một loopand lặp lại quá trình nội suy và vẽ đồ thị các điểm dữ liệu, như được hiển thị trong đoạn mã bên dưới.

kind = ['linear', 'nearest', 'zero', 'slinear', 'quadratic', 'cubic', 'previous', 'next']
fig = plt.figure()
ax = fig.subplots()

for i in kind:
      #interpolation step
      f = interpolate.interp1d(x, y, kind = i)
      #y array that contains the interpolated data points
      y_interp = f(x_new)
     ax.plot(x_new, y_interp, alpha = 0.5, label = i)

ax.scatter(x,y)
plt.legend()
plt.show()

Như bạn có thể thấy trong đoạn mã, trong vòng lặp For, chúng tôi thực hiện phép nội suy bằng cách gọi hàm

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
9 và đưa ra làm đầu vào mảng X và Y được xác định ở đầu đoạn; Hàm nội suy sau đó được gán cho biến F F F. Ở mỗi bước lặp, các loại nội suy của loại khác sẽ thay đổi, chọn theo các loại khác nhau có trong danh sách loại loại. Để cuối cùng có được các giá trị của các điểm chưa biết, có trong mảng, x_new, chúng tôi xác định mảng Kết quả cuối cùng được hiển thị trong Hình 1.

Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

Hình 1: Các hàm nội suy khác nhau (các loại). Các chấm màu xanh là điểm dữ liệu ban đầu, được biết đến; Như có thể thấy, thông qua quá trình nội suy, chúng tôi hiện có thể có được các giá trị của tất cả các điểm nằm ở giữa các điểm màu xanh. Different interpolating functions (kinds). The blue dots are the initial, known data points; as can be seen, through the process of interpolation we are now able to obtain the values of all those points located in between the blue ones.

Điều quan trọng là nhấn mạnh rằng các điểm duy nhất được biết đến mà chúng tôi đã lấy được tất cả các ô được hiển thị trong Hình 1, là những điểm màu xanh (mười điểm). Thông qua quá trình nội suy, chúng tôi đã thu được giá trị của tất cả các điểm nằm ở giữa phạm vi của mười điểm dữ liệu này. Nói chung, khi nội suy một tập dữ liệu nhất định, điều quan trọng là phải có thêm thông tin nhất có thể về phân phối các điểm dữ liệu đã biết; Điều này giúp hiểu được loại chức năng nội suy nào sẽ mang lại kết quả tốt nhất. Tuy nhiên, trong hầu hết các trường hợp, nội suy bậc hai và khối là những trường hợp mang lại kết quả tốt nhất, như bạn có thể thấy, chúng được đặt chồng lên hầu hết các điểm dữ liệu. & NBSP;

Nội suy 2D

Bây giờ chúng tôi đã giới thiệu quy trình nội suy trên các bộ dữ liệu một chiều, đó là thời gian để áp dụng điều tương tự theo hai chiều. Như bạn sẽ thấy, thủ tục rất giống nhau; Lần này, hàm sẽ được sử dụng được gọi là

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
0.

Vì chúng tôi đang xử lý các điểm dữ liệu hai chiều, để vẽ chúng, chúng tôi cần tạo một lưới các điểm và sau đó gán một giá trị cụ thể cho tất cả các điểm trên lưới; Đây sẽ là các điểm dữ liệu ban đầu, được biết đến mà từ đó chúng tôi nội suy các giá trị của các điểm dữ liệu khác.

Để xây dựng lưới các điểm của chúng tôi, trước tiên chúng tôi xác định một mảng X và Y (được gọi là X X và và Y) bằng cách sử dụng

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
7; Lần này, các điểm trên lưới của chúng tôi sẽ là 13 và sẽ dao động từ 0 đến bốn. Để xác định lưới từ hai mảng này, chúng tôi sử dụng hàm numpy
scipy.interpolate.interp(1D, 2D, 3D)
1. Đoạn mã sau đây mô tả việc tạo lưới.

x = np.linspace(0, 4, 13)
y = np.linspace(0, 4, 13)
X, Y = np.meshgrid(x, y)   

Để hoàn thành định nghĩa về bộ điểm dữ liệu ban đầu của chúng tôi, chúng tôi phải gán một giá trị cụ thể cho tất cả các cặp (x, y) của các điểm trên lưới. Để làm điều đó, chúng tôi xác định một mảng mới có tên Z, phụ thuộc vào các giá trị của X và Y (các điểm của lưới) và được xác định bởi phương trình sau:

Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
0

Tương tự như những gì chúng tôi đã làm trong trường hợp một chiều, giờ đây chúng tôi xác định một lưới mới và dày đặc hơn có chứa các điểm sẽ được nội suy từ các giá trị (x, y). 65 điểm của lưới mới này vẫn nằm trong khoảng từ 0 đến bốn và được lưu trữ trong mảng X2 X2 và Y2 Y2. Quá trình này giống như quy trình được sử dụng để xác định lưới đầu tiên.

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
1

Bước tiếp theo là nội suy; Chúng tôi gọi hàm

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
0 và gán đầu ra của nó (hàm nội suy) cho biến F F F F. Ngoài ra trong trường hợp hai chiều, chúng ta có thể chọn loại nào của loại chức năng nội suy để sử dụng trong quy trình, lần này chỉ có ba tùy chọn Được sử dụng trong phép nội suy (để biết thêm về khái niệm spline, vui lòng tham khảo https://en.wikipedia.org/wiki/spline_(mathatics)). Cuối cùng chúng tôi gán cho biến Z2, các giá trị của các điểm được nội suy mà trước đây chúng tôi lưu trữ trong các mảng X2 và Y2. Các dòng sau đây mô tả quá trình nội suy.

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
2

Với bước này, chúng tôi đã hoàn thành phép nội suy 2 chiều và do đó chúng tôi có thể vẽ các kết quả để có một biểu diễn đồ họa về những gì đã được thực hiện bởi hàm. Để hiểu rõ hơn về quá trình nội suy theo hai chiều, chúng tôi vẽ cả lưới 13 × 13 ban đầu (trái) và 65 × 65 được nội suy (phải).

Các ô của chúng tôi sẽ hiển thị các lưới các điểm và sẽ mô tả giá trị của mỗi cặp (x, y) với tỷ lệ màu. Để đạt được kết quả như vậy, chúng ta có thể khai thác chức năng matplotlib

scipy.interpolate.interp(1D, 2D, 3D)
3 cho phép tạo ra biểu đồ giả với lưới hình chữ nhật không thường xuyên (https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.pcolormesh ). & nbsp;

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
3

Kết quả cuối cùng được hiển thị trong Hình 2:

Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

Hình 2: Kết quả của .Interp2d (); Bắt đầu từ lưới 13 × 13 (trái), chúng ta có thể nội suy các giá trị được gán cho mỗi cặp (x, y) và thu được các giá trị của các cặp điểm dọc theo lưới 65 × 65 (phải). Result of .interp2d(); starting from a 13×13 grid (left), we can interpolate the values assigned to each (x, y) couple and obtain the values of the couples of points along a 65×65 grid (right).

Như bạn có thể thấy trong Hình 2, thông qua quá trình nội suy 2D, chúng tôi đã dày đặc lưới đầu tiên bằng cách nội suy giá trị của các điểm bổ sung có trong phạm vi của các điểm lưới ban đầu.

Nội suy 3D

Chúng tôi kết thúc bài viết này với phép nội suy cuối cùng, chúng tôi tăng lại kích thước và giải quyết trường hợp ba chiều. Để thực hiện nhiệm vụ này, chúng tôi khai thác hàm .Interpn (), có thể được sử dụng, nói chung, cho các phép nội suy đa chiều trên lưới thông thường (có thể tìm thấy nhiều tài liệu hơn ở đây https://docs.scipy.org/doc/scipy/reference /generated/scipy.interpolate.interpn.html); Điều này có nghĩa là chúng ta có thể sử dụng chức năng này để thực hiện phép nội suy trên dữ liệu có kích thước N, với N có thể thậm chí cao hơn 3.

Tương tự như các trường hợp khác, chúng tôi bắt đầu mã của mình bằng cách xác định các mảng sẽ tạo thành lưới 3D của chúng tôi, lần này chúng tôi sẽ cần ba mảng bằng nhau, được gọi là X X, Sau đó, chúng tôi lưu trữ tất cả chúng trong một bộ tuple có tên là Points Points sẽ có ích sau này. Hơn nữa, chúng tôi xác định lưới 3D, sử dụng lại ____ 41. & nbsp;

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
4

Tại các điểm này, chúng tôi phải gán một giá trị cho tất cả các điểm của (x, y, z) trên lưới; Để làm điều đó, chúng tôi xác định chức năng của Func_3d (x, y, z), đối với một tập hợp các giá trị x, y và z cụ thể, trả về biểu thức:

Hướng dẫn interpolate between two 3d points python - nội suy giữa hai điểm 3d python

Như bạn có thể thấy, hàm phụ thuộc vào ba biến độc lập. Các giá trị của tất cả các bộ ba (x, y, z) sẽ được lưu trữ trong các giá trị mảng, định nghĩa bằng cách gọi hàm là func_3d trên tất cả các điểm x, y, z.

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
5

Vì không thể vẽ đồ thị được tạo ra (nó sẽ dẫn đến một lô bốn chiều); Chúng tôi chỉ xác định một mảng chứa bộ ba điểm mà chúng tôi muốn nội suy dưới dạng danh sách. Trong trường hợp của chúng tôi, chúng tôi sẽ thực hiện phép nội suy chỉ trên một bộ ba, được xác định trong mảng điểm điểm.

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
6

Bây giờ chúng tôi gọi hàm

import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
1 để thực hiện phép nội suy. Khác với hai chức năng trước đó,
import numpy as np

# arbitrary z
z1, x1, y1 = 0.822, 174269.8332, 608470.8717
z2, x2, y2 = 0.692, 174269.5191, 608480.8668

print(find_xy((x1, y1, z1), (x2, y2, z2), .7))
print(find_xy((x1, y1, z1), (x2, y2, z2), .8))

# z = 0
z1, x1, y1 = 0.022, 174267.9486, 608530.8421
z2, x2, y2 = -0.262, 174267.6345, 608540.8372

print(find_xy((x1, y1, z1), (x2, y2, z2), 0))
1 không có tùy chọn loại Kind, mà thay vào đó, nó trình bày một chức năng gọi là Phương thức Hồi giáo; Giá trị mặc định là tuyến tính. Các đầu vào của hàm này là bộ tuple chứa cả ba mảng tạo thành lưới 3D ban đầu (cụ thể là X X. Được lưu trữ trong các giá trị mảng trên mạng) và mảng chứa tọa độ của các điểm mà chúng tôi muốn thực hiện phép nội suy (trong trường hợp của chúng tôi, chỉ một điểm, có tọa độ được lưu trữ trong điểm Point Point). Chúng tôi đưa tất cả những điều này vào một lệnh in ấn của người Viking để trực tiếp thu được kết quả của phép nội suy:

def find_xy(p1, p2, z):

    x1, y1, z1 = p1
    x2, y2, z2 = p2
    if z2 < z1:
        return find_xy(p2, p1, z)

    x = np.interp(z, (z1, z2), (x1, x2))
    y = np.interp(z, (z1, z2), (y1, y2))

    return x, y
7

Kết quả cuối cùng là 13,0; là giá trị nội suy cho điểm tọa độ (2.5, 3,5, 1.5).