计算空间测量的导数



我有一组空间分布的测量值。对于每个点p1 = [x1,y1,z1],都有一个测量值v1,它是一个标量。(例如:水下温度测量。)让我们假设这些测量是在一个规则的网格上。我想找出这个分布中变化最大的地方。这意味着在什么位置温度变化最大。我认为这对应于温度的空间推导。谁能给我提个建议该怎么做?归档这些数据的方法是什么?我试图用np.gradient()来实现它,但我无法解释结果…

这绝对不是一个优化的代码,但这是我想到的,至少解释了它是如何工作的。

grid = [[[1, 2], [2, 3]], [[8, 5], [4, 1000]]]
def get_greatest_diff(g, x, y, z):
value = g[x][y][z]
try:
diff_x = abs(value-g[x+1][y][z])
except IndexError:
diff_x = -1
try:
diff_y= abs(value-g[x][y+1][z])
except IndexError:
diff_y = -1
try:
diff_z = abs(value-g[x][y][z+1])
except IndexError:
diff_z = -1
if diff_x>=diff_y and diff_x>=diff_z:
return diff_x, [x+1, y, z]
if diff_y>diff_x and diff_y>=diff_z:
return diff_y, [x, y+1, z]
return diff_z, [x, y, z+1]
greatest_diff = 0
greatest_diff_pos0 = []
greatest_diff_pos1 = []
for x in range(len(grid)):
for y in range(len(grid[x])):
for z in range(len(grid[x][y])):
diff, coords = get_greatest_diff(grid, x, y, z)
if diff > greatest_diff:
greatest_diff = diff
greatest_diff_pos0 = [x, y, z]
greatest_diff_pos1 = coords
print(greatest_diff, greatest_diff_pos0, greatest_diff_pos1)

try:...except:...在这里处理边缘条件。(这很脏,但是很快!)

对于每个单元格,您将查看三个相邻的x+1y+1z+1,并计算其值的差值。你把最大的差价留在附近,然后返还。(这是get_greatest_diff的解释)

在主循环中,检查这个邻域的差值是否最大,如果是,则存储差值,并存储两个单元格。

最后,返回最大差值和所讨论的单元格。

这里是一个numpy解决方案,它返回ndarray中与其相邻节点总差异最大的索引。假设输入数组是X,它是2D。我将创建DD[i,j] = |X[i, j]-X[i-1, j]|+|X[i,j]-X[i, j-1]|。并返回D中给出D中最大值的索引。

def greatest_diff(X):

ndim = X.ndim
Ds = [np.abs(np.diff(X, axis = i, prepend=0)) for i in range(ndim)]
D = sum(Ds)
return np.unravel_index(D.argmax(), D.shape)
X = np.zeros((5,5))
X[2,2] = 1
greatest_diff(X)
# returns (2, 2)
X = np.zeros((5,10,9))
X[2,2,7] = -1
greatest_diff(X)
# returns (2, 2, 7)

另一个解决方案可能是计算X[i, j]sum(X[k, l])之间的差,其中k,li, j的邻居。你可以通过对X(比如gX)应用高斯滤波器来实现这一点,然后取差的平方:(X-gX)^2

def greatest_diff_gaussian(X, sigma = 1):
from scipy.ndimage import gaussian_filter
gX = gaussian_filter(X, sigma)
dgX = np.power(X - gX, 2)
return np.unravel_index(dgX.argmax(), dgX.shape)

最新更新