You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在numpy.ndarray中计算x、y方向角度以得到预期结果?

问题:如何计算得到预期的x方向角度数组?

场景与数组定义

创建了如下numpy.ndarray类型的surface数组:

import numpy as np

surface = np.zeros((10, 10))
surface[5, 5] = 1

数组内容为:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

预期输出

想要计算x方向的角度,预期输出为:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 45 0 -45 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

尝试的代码及结果

尝试了以下代码:

grad_y, grad_x = np.gradient(surface)
degrees_x = np.degrees(np.arctan(grad_x))

但得到的结果为:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 26.560505 0 -26.560505 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
 [0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]

解决方案

原因分析

np.gradient默认使用中心差分计算梯度,对于位置(5,4),它的计算方式是(surface[5,5] - surface[5,3])/2 = (1-0)/2 = 0.5,arctan(0.5)对应的角度约为26.56度,和预期的45度不符——45度对应的是梯度值为1的情况(arctan(1)=45°)。

实现代码

要得到预期结果,需要计算不除以2的中心差分(即直接用右侧第二个元素减左侧第二个元素),代码如下:

import numpy as np

surface = np.zeros((10, 10))
surface[5, 5] = 1

# 初始化x方向梯度数组
grad_x = np.zeros_like(surface)
# 对中间列计算梯度:右侧第二个元素 - 左侧第二个元素
grad_x[:, 1:-1] = surface[:, 2:] - surface[:, :-2]
# 计算对应的角度
degrees_x = np.degrees(np.arctan(grad_x))

# 输出结果
print(degrees_x)

运行后,degrees_x的第5行即为[0. 0. 0. 0. 45. 0. -45. 0. 0. 0.],完全匹配预期输出。

原理说明

  • 对于位置(5,4),梯度值为surface[5,5] - surface[5,3] = 1-0=1,arctan(1)转换为角度就是45°;
  • 对于位置(5,6),梯度值为surface[5,7] - surface[5,5] =0-1=-1,arctan(-1)转换为角度就是-45°;
  • 其余位置梯度值为0,对应角度也为0,符合预期。

内容的提问来源于stack exchange,提问作者HJA24

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 11:27:28