The*_*tor 6 python geometry astronomy computational-geometry
我在天空中有一组近10000点.它们使用天空中的RA(右上升)和DEC(赤纬)绘制.绘制时,它们采用圆形.

我想要做的是将圆切成8个相等的部分,一次删除一个部分并使用其余部分进行一些计算.
为此,我想到了这个插图,即使用弧切片.
我知道弧的方程式由下式给出:
S = r * theta
Run Code Online (Sandbox Code Playgroud)
哪里
r --> radius
theta --> angle (in our case 45 degrees)
Run Code Online (Sandbox Code Playgroud)
我会以某种方式喜欢这样做:
slice1 = []
for a,b in zip(ra,dec):
if a>some value and a<some value and b>some value and b<some value:
slice1.append(a,b)
Run Code Online (Sandbox Code Playgroud)
如果它们是正方形,则变得非常简单,并且可以立即应用上述等式.
所以一旦我得到了切片,我就可以做一个numpy.where()找出我圈子的其余部分.
我只需提一下即可轻松将其切成四片min(RA),max(RA),min(DEC) and max(DEC).我为第一象限做的一个这样的例子会给我这样的:
RA>0.0 and RA<max(RA) DEC>0.0 and DEC<max(DEC)
Run Code Online (Sandbox Code Playgroud)

我不知道如何在我的情况下这样做(即进入8个象限!!),其中我只有我的数据点的x,y坐标!
你应该使用math.atan2:
angle = math.atan2(dec, ra)
if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4:
# point is inside slice number n
Run Code Online (Sandbox Code Playgroud)
基本上,atan2将角度返回到x轴的点.通过将其划分为pi/4的间隔,您可以获得切片.但要注意 - atan2返回-pi和pi之间的角度,因此您应该将切片编号从-4到3(或者您可以将pi添加到角度,或以其他方式转换).
编辑:修改你的代码,它看起来像这样:
slice1 = []
n = 0 #change 0 to desired slice number here (from -4 to 3)
for a,b in zip(ra,dec):
angle = math.atan2(b,a)
if angle >= n*math.pi/4 and angle < (n+1)*math.pi/4:
slice1.append(a,b)
Run Code Online (Sandbox Code Playgroud)
您可以直接使用 with 运算符计算切片编号数组numpy:
sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N / (2*pi)))
Run Code Online (Sandbox Code Playgroud)
意义:
-pi...piarctan2pi成为正区间0..N-1