我有一组空间分布的测量值。对于每个点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+1
或y+1
或z+1
,并计算其值的差值。你把最大的差价留在附近,然后返还。(这是get_greatest_diff
的解释)
在主循环中,检查这个邻域的差值是否最大,如果是,则存储差值,并存储两个单元格。
最后,返回最大差值和所讨论的单元格。
这里是一个numpy
解决方案,它返回ndarray
中与其相邻节点总差异最大的索引。假设输入数组是X
,它是2D
。我将创建D
在D[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,l
是i, 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)