Ho una lista di punti 3D, e voglio montare la a una sfera:Come posso adattare i dati 3D
R^2 = (x-x0)^2 + (y-y0)^2 + (z-z0)^2
Così ho pensato, mi esprimo z, e in forma di dati 2D con 4 parametri (x0, y0, Z0 e R):
z = sqrt(R^2 - (x-x0)^2 - (y-y0)^2) + z0
Ecco un codice (si tratta di una parte del più ampio progetto):
#!/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
ottengo l'errore:
012.ValueError: operands could not be broadcast together with shapes (2) (1404)
Ecco un collegamento a data.npy.
Perché dovresti 'coords.T'? – Adobe
@Adobe Poiché 'coords' ha forma' (100, 3) ', ma' coords.T' ha shape '(3, 100)', e quindi decomprime una riga in ogni variabile quando si esegue 'x, y, z = coords.T'. – Jaime
Oh, è bello. Ho fatto 'zCoords = Coordinates [:, 2]' per una cosa simular. – Adobe