【发布时间】:2019-02-26 18:13:17
【问题描述】:
对称函数的梯度应该在所有维度上都具有相同的导数。 numpy.gradient 提供不同的组件。
这是一个 MWE。
import numpy as np
x = (-1,0,1)
y = (-1,0,1)
X,Y = np.meshgrid(x,y)
f = 1/(X*X + Y*Y +1.0)
print(f)
>> [[0.33333333 0.5 0.33333333]
[0.5 1. 0.5 ]
[0.33333333 0.5 0.33333333]]
这在两个维度上具有相同的值。
但是np.gradient(f)给了
[array([[ 0.16666667, 0.5 , 0.16666667],
[ 0. , 0. , 0. ],
[-0.16666667, -0.5 , -0.16666667]]),
array([[ 0.16666667, 0. , -0.16666667],
[ 0.5 , 0. , -0.5 ],
[ 0.16666667, 0. , -0.16666667]])]
渐变的两个分量是不同的。
为什么会这样? 我在解释输出时遗漏了什么?
【问题讨论】:
-
因为导数是沿方向计算的,所以在比较它们时也需要考虑这个方向。沿 Y 轴查看的 Y 分量与沿 X 轴查看的 X 分量相同。即你可以通过将Y导函数顺时针旋转90度来看到原始函数的旋转对称性。
-
@meowgoesthedog 那么这样的3维数组的结果应该怎么看呢?
-
在 3D 中,您还必须在更改坐标系时保持轴的循环顺序,即在 XYZ 框架中查看 X 分量,在 YZX 中查看 Y,在 ZXY 中查看 Z .
-
@meowgoesthedog 是的,似乎是这样。我认为这应该在 numpy.gradient 文档中提及。
-
@meowgoesthedog 是否有任何方法可以撤消这种“循环”并获得 n 维数组的导数?