问题
I have experimental observations in a volume:
import numpy as np
# observations are not uniformly spaced
x = np.random.normal(0, 1, 10)
y = np.random.normal(5, 2, 10)
z = np.random.normal(10, 3, 10)
xx, yy, zz = np.meshgrid(x, y, z, indexing='ij')
# fake temperatures at those coords
tt = xx*2 + yy*2 + zz*2
# sample distances
dx = np.diff(x)
dy = np.diff(y)
dz = np.diff(z)
grad = np.gradient(tt, [dx, dy, dz]) # returns error
This gives me the error:
ValueError: operands could not be broadcast together with shapes (10,10,10) (3,9) (10,10,10)
.
EDIT: according to @jay-kominek in the comments below:
np.gradient won't work for you, it simply doesn't handle unevenly sampled data.
I've updated the question. Is there any function which can can do my computation?
回答1:
Two things to note: First, scalars are single values, not arrays. Second, the signature of the function is numpy.gradient(f, *varargs, **kwargs)
. Note the * before varargs
. That means if varargs
is a list, you pass *varargs
. Or you can just provide the elements of varargs
as separate arguments.
So, np.gradient
wants a single value for the distance along each dimension, like:
np.gradient(tt, np.diff(x)[0], np.diff(y)[0], np.diff(z)[0])
or:
distances = [np.diff(x)[0], np.diff(y)[0], np.diff(z)[0]]
np.gradient(tt, *distances)
回答2:
The required dx ... to be passed to np.gradient
aren't grids of differences, but just one scalar each. So grad = np.gradient(tt,0.1,0.1,0.1)
appears to work.
来源:https://stackoverflow.com/questions/36781698/function-to-compute-3d-gradient-with-unevenly-spaced-sample-locations