将圆切成相等的部分,Python
Slicing a circle in equal segments, Python
我有一套天上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 坐标!!
你应该使用 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 returns 从 x 轴到点的角度。通过将其划分为 pi/4 的间隔,您可以得到切片。但要注意 - atan2
returns -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)
首先,使用您的公式找到象限。然后可以通过比较 abs(x)
和 abs(y)
.
来确定八分圆
在下八分圆中,abs(x) >= abs(y)
。另一个有abs(x) < abs(y)
您可以使用 numpy
运算符直接计算切片编号数组:
sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N / (2*pi)))
含义:
- 用
arctan2
计算每个点的角度-pi
...pi
- 平移
pi
使其成为正区间
- 重新调整为
0
..N-1
- 转换为整数
我有一套天上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 坐标!!
你应该使用 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 returns 从 x 轴到点的角度。通过将其划分为 pi/4 的间隔,您可以得到切片。但要注意 - atan2
returns -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)
首先,使用您的公式找到象限。然后可以通过比较 abs(x)
和 abs(y)
.
在下八分圆中,abs(x) >= abs(y)
。另一个有abs(x) < abs(y)
您可以使用 numpy
运算符直接计算切片编号数组:
sliceno = numpy.int32((pi + numpy.arctan2(Y, X)) * (N / (2*pi)))
含义:
- 用
arctan2
计算每个点的角度 - 平移
pi
使其成为正区间 - 重新调整为
0
..N-1
- 转换为整数
-pi
...pi