根据条件选择一些元素
Selecting some elements based on conditions
我有 RA
和 DEC
以及 z
几个元素。它们有点表示元素的 x、y、z 位置。
它们是存储在数组中的值。
max(z) = 3.0
,是第三维我这里没有展示。
我想做的是,根据一定的条件去掉下图中方框内的那些元素,把方框外的元素给我(还有z<1.0
)
所以从图片中的示例来看,我需要黑框外的所有元素 以及 第三个条件z<1.0
我试过但不起作用的是以下:
data_z = contains all the z values
data_RA = contains all the RA values
data_DEC = contains all the DEC values
ra_lim = np.array([[40.0,43.0],[43.0,46.0],[46.0,50.0]])
dec_lim = np.array([[4.0,8.0],[0.0,4.0],[-2.0,0.0]])
new_z = data_z[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
new_RA = data_RA[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
new_DEC = data_DEC[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
所以基本上
~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
应该表示框,~
符号应该给我逆条件。即排除此框中的值并将剩余的值还给我。
但这似乎不起作用。 如何在第三个条件 z<1.0
的情况下获取框外的值???
这是一个有效的小例子:
x = np.array([1,5,7,9,4,5,6,8,9,0,3])
y = np.array([2,4,5,7,3,2,6,2,7,8,3])
假设您想要获取由 (x < 6, y < 5) 定义的框外的所有元素。该框由 (x < 6) * (y < 5) 表示。如果你想要盒子的外面,你可以取相反的:~((x < 6) * (y < 5))
。这等于 ~(x < 6) + ~(y < 5)
而不是 ~(x < 6) * ~(y < 5)
(如您的代码中所写)。
mask = ~(x < 6) + ~(y < 5)
print x[mask]
print y[mask]
## [7 9 6 8 9 0]
## [5 7 6 2 7 8]
在你的情况下,掩码应该是
mask = (data_z<1.0) * ~((data_ra>ra_lim[0][0]) * (data_ra<ra_lim[0][1])
* (data_dec>dec_lim[0][0]) * (data_dec<dec_lim[0][1]))
我有 RA
和 DEC
以及 z
几个元素。它们有点表示元素的 x、y、z 位置。
它们是存储在数组中的值。
max(z) = 3.0
,是第三维我这里没有展示。
我想做的是,根据一定的条件去掉下图中方框内的那些元素,把方框外的元素给我(还有z<1.0
)
所以从图片中的示例来看,我需要黑框外的所有元素 以及 第三个条件z<1.0
我试过但不起作用的是以下:
data_z = contains all the z values
data_RA = contains all the RA values
data_DEC = contains all the DEC values
ra_lim = np.array([[40.0,43.0],[43.0,46.0],[46.0,50.0]])
dec_lim = np.array([[4.0,8.0],[0.0,4.0],[-2.0,0.0]])
new_z = data_z[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
new_RA = data_RA[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
new_DEC = data_DEC[(data_z<1.0) * ~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
所以基本上
~(data_ra>ra_lim[0][0]) * ~(data_ra<ra_lim[0][1])
* ~(data_dec>dec_lim[0][0]) * ~(data_dec<dec_lim[0][1])]
应该表示框,~
符号应该给我逆条件。即排除此框中的值并将剩余的值还给我。
但这似乎不起作用。 如何在第三个条件 z<1.0
的情况下获取框外的值???
这是一个有效的小例子:
x = np.array([1,5,7,9,4,5,6,8,9,0,3])
y = np.array([2,4,5,7,3,2,6,2,7,8,3])
假设您想要获取由 (x < 6, y < 5) 定义的框外的所有元素。该框由 (x < 6) * (y < 5) 表示。如果你想要盒子的外面,你可以取相反的:~((x < 6) * (y < 5))
。这等于 ~(x < 6) + ~(y < 5)
而不是 ~(x < 6) * ~(y < 5)
(如您的代码中所写)。
mask = ~(x < 6) + ~(y < 5)
print x[mask]
print y[mask]
## [7 9 6 8 9 0]
## [5 7 6 2 7 8]
在你的情况下,掩码应该是
mask = (data_z<1.0) * ~((data_ra>ra_lim[0][0]) * (data_ra<ra_lim[0][1])
* (data_dec>dec_lim[0][0]) * (data_dec<dec_lim[0][1]))