Tôi có một danh sách các điểm 3D, và tôi muốn để phù hợp với một lĩnh vực:làm cách nào để phù hợp với dữ liệu 3D
R^2 = (x-x0)^2 + (y-y0)^2 + (z-z0)^2
Vì vậy, tôi nghĩ, tôi muốn bày tỏ z, và phù hợp với dữ liệu 2D với 4 tham số (x0, y0, z0 và R):
z = sqrt(R^2 - (x-x0)^2 - (y-y0)^2) + z0
Dưới đây là một mã (nó là một phần của dự án lớn hơn):
#!/usr/bin/python
from scipy import *
from scipy.optimize import leastsq
Coordinates = load("data.npy")
xyCoords = Coordinates[:, [0, 1]]
zCoords = Coordinates[:, 2]
p0 = [149.33499, 148.95999, -218.84893225608857, 285.72893713890107]
fitfunc = lambda p, x: sqrt(p[3]**2 - (x[0] - p[0])**2 - (x[1] - p[1])**2) + x[2]
errfunc = lambda p, x, z: fitfunc(p, x) - z
p1, flag = leastsq(errfunc, p0, args=(xyCoords, zCoords))
print p1
tôi nhận được lỗi:
012.ValueError: operands could not be broadcast together with shapes (2) (1404)
Đây là liên kết đến data.npy.
Tại sao bạn 'coords.T'? – Adobe
@Adobe Bởi vì 'coords' có hình dạng' (100, 3) ', nhưng' coords.T' có hình dạng '(3, 100)', và do đó nó unpacks một hàng vào mỗi biến khi bạn làm 'x, y, z = coords.T'. – Jaime
Ồ, thật tuyệt. Tôi đã làm 'zCoords = Tọa độ [:, 2]' cho điều mô phỏng. – Adobe