Supponiamo di avere tre array 1D arbitrari, ad esempio:Creazione di un array NumPy di 3D coordinate da tre matrici 1D
x_p = np.array((1.0, 2.0, 3.0, 4.0, 5.0))
y_p = np.array((2.0, 3.0, 4.0))
z_p = np.array((8.0, 9.0))
Questi tre matrici rappresentano intervalli di campionamento in una griglia 3D, e voglio costruire un 1D serie di vettori tridimensionali per tutte le intersezioni, qualcosa come
points = np.array([[1.0, 2.0, 8.0],
[1.0, 2.0, 9.0],
[1.0, 3.0, 8.0],
...
[5.0, 4.0, 9.0]])
Ordinare in realtà non importa per questo. Il modo più ovvio per generarli:
npoints = len(x_p) * len(y_p) * len(z_p)
points = np.zeros((npoints, 3))
i = 0
for x in x_p:
for y in y_p:
for z in z_p:
points[i, :] = (x, y, z)
i += 1
Quindi la domanda è ... c'è un modo più veloce? Ho cercato ma non trovato (forse non sono riuscito a trovare le parole chiave di Google corrette).
Attualmente sto usando questo:
npoints = len(x_p) * len(y_p) * len(z_p)
points = np.zeros((npoints, 3))
i = 0
nz = len(z_p)
for x in x_p:
for y in y_p:
points[i:i+nz, 0] = x
points[i:i+nz, 1] = y
points[i:i+nz, 2] = z_p
i += nz
ma mi sento come mi manca un po 'di fantasia modo Numpy intelligente?
Questa domanda è stata contrassegnata come duplicata; è una domanda simile, ma (ovviamente sono di parte) penso che la mia domanda sia una frase più semplice di un problema più generale. Penso anche che la risposta a questa domanda sia migliore; l'uso di meshgrid sembra essere la soluzione più semplice e veloce. –
Inoltre, l'estensione da 2D a 3D non è ovvia secondo me. Vedere che le risposte hanno strutture simili implica che le estensioni straight-forward sono un buon inizio, ma, * a priori *, non era chiaro che funzionassero. – tom10