我在天空中有一组近10000点。它们使用天空中的RA(右上升)和DEC(赤纬)绘制。绘制时,它们采用圆形。
我想要做的是 将圆圈切成8个相等的部分 并逐个删除每个部分并使用其余部分进行一些计算。
为此,我想到了这个插图,即使用弧切片。
我知道弧的等式由下式给出:
S = r * theta
其中
r --> radius
theta --> angle (in our case 45 degrees)
我想以某种方式喜欢这样做:
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)
如果它们是正方形,则变得非常简单,并且可以立即应用上述等式。
所以,一旦我得到了切片,我就可以做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)
我不知道如何在我的情况下这样做(即进入8个象限!!),其中我只有我的数据点的x,y坐标!!
答案 0 :(得分:5)
您应该使用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
基本上,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)
答案 1 :(得分:4)
您可以使用numpy
运算符直接计算切片编号数组:
sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N / (2*pi)))
含义:
-pi
pi
... arctan2
pi
移动以使其成为正间隔0
.. N-1
答案 2 :(得分:2)
首先,使用您的公式找到象限。然后可以通过将abs(x)
与abs(y)
进行比较来确定八分圆。
在下八分圆abs(x) >= abs(y)
。另一个有abs(x) < abs(y)