寻找一种更优雅的方法来获得圆柱坐标中的2D numpy方位角数组

thr*_*434 1 python math numpy

标题说明了一切.我正在寻找一种方法来编写2D阵列中方位角的计算更优雅.这与以下事实有关:arcus函数仅定义在从0到pi或-pi/2到pi/2的范围内.有任何想法吗?

import numpy as np
import matplotlib.pyplot as plt

#Setup
x = np.linspace(-10, 10, 200)
y = np.linspace(-10, 10, 200)
x, y = np.meshgrid(x, y)
r = (x**2+y**2)**0.5

#get array of azimuthal angles
phi = np.arctan(y/x)
phi = np.where(np.less_equal(x, 0), phi+np.pi, phi)
phi = np.where(np.logical_and(np.greater_equal(x, 0), np.less_equal(y, 0)), phi+2*np.pi, phi)

#Test the calculation
# make a pizza with one slice missing
z = np.where(np.logical_and(np.less_equal(r, 5), np.less_equal(phi, 2*np.pi*(1-1/12)), np.less_equal(0, phi)), 1, 0)

#plot it
plt.imshow(z, extent=[-10, 10, -10, 10], origin="Upper")
plt.colorbar()
plt.show()
Run Code Online (Sandbox Code Playgroud)

编辑: 正如你们所指出的那样,我可以使用arctan2-Function进行这项工作,但是这个功能的不连续部分是+/- pi而不是0/2pi,因为我需要它.

我可以phi使用这个函数定义:

phi = np.arctan2(y, x)+2*np.pi*(np.sign(-y)+np.abs(np.sign(-y)))/2
Run Code Online (Sandbox Code Playgroud)

然而,这不是很漂亮......

编辑2:解决方案

正如@MvG指出的那样,以下定义正是我所需要的.

phi = np.pi + np.arctan2(-y, -x)
Run Code Online (Sandbox Code Playgroud)

要么

phi = np.pi - np.arctan2(y, -x)
Run Code Online (Sandbox Code Playgroud)

MvG*_*MvG 6

大多数编程语言中将一对坐标转换为角度的常用方法是使用常规调用的函数atan2.正如gboffi在评论中已经提到的那样,numpy等价物被称为numpy.arctan2.当你在它时,你可能想numpy.hypot用来计算r.

既然您在问题的评论和编辑中都表明您特别关注[0,2π]范围,那么让我们来看看.基本上有两种方法可以将结果atan2(在[-π,π]范围内)映射到您想要的范围:取π并加上或减去atan2的结果.你选择哪一种并没有多大区别.如果添加,则需要将输入旋转atan2180°,这意味着否定两个坐标.你结束了

phi = np.pi + np.arctan2(-y, -x)
Run Code Online (Sandbox Code Playgroud)

如果减去,则可以将上述作为起点,但翻转y坐标的符号以翻转条目.在这种情况下的结果将是

phi = np.pi - np.arctan2(y, -x)
Run Code Online (Sandbox Code Playgroud)

正如我所说,两者都应该导致相同的结果.第二个可能会更快一点,因为它需要少一个操作.第一个可能更容易思考,因此更容易维护.显然有对差异y=0的情况下,在第一行的结果2π但第二个结果为0.我有点感到意外,因为我预料的区别+0,并-0作出了差异atan2,从而导致到最后的结果.