如何使用 Python 匹配相似的坐标?

2024-03-26

背景:

我收到了四个数据目录,其中第一个目录(我们称之为 Cat1)给出了场 1 和 2 中无线电源的坐标(赤经和赤纬、RA 和 Dec),第二个目录(Cat2)给出了 RA和 Dec 适用于领域 1 中的无线电源和红外 (IR) 源,第三个目录 (Cat3) 给出了领域 2 中的无线电和红外源的 RA 和 Dec,第四个目录 (Cat4) 给出了光源的 RA 和 Dec在字段 1 和 2 中。

Cat1 具有大约 2000 个场 2 源,请记住,某些源实际上在其维度上进行了多次测量,例如;源 1、源 2、源 3a、源 3b、源 3c、源 4... Cat1 大约有 3000 个场 1 源,其中一些源还是部分的。 Cat 1 是一个 .dat 文件,我在 textedit 中打开该文件,并将其转换为 .txt 以与 np.genfromtxt 一起使用。

Cat2 具有字段 1 的大约 1700 个源。 Cat3 拥有大约 1700 个字段 2 的源。 Cat2 和 Cat3 是 .csv 文件,我在 Numbers 中打开它们。

Cat4 大约有 1200 个字段 1 的源,大约 700 个字段 2 的源。Cat4 是一个 .dat 文件,我在 textedit 中打开该文件,并将其转换为 .txt 以与 np.genfromtxt 一起使用。

还弄清楚了如何转换 .csv 文件中的 Cat1 和 Cat4。

Aim:

目标是将这四个目录合并为一个目录,该目录给出来自 Cat2、Cat1 和 Cat4(字段 1)的 RA 和 Dec,然后给出来自 Cat3、Cat1 和 Cat4(字段 2)的 RA 和 Dec,这样 RA来自 Cat1 和 Cat4 的 RA 和 Dec 与来自 Cat1 或 Cat2 的 RA 和 Dec 最接近,因此可以说它们很可能是同一源。 重叠程度会有所不同,但我已经为数据生成了散点图,显示每个 Cat2 和 Cat3 源都有相应的 Cat1 和 Cat4 源,在绘图标记大小的精度范围内,当然还有许多剩余源在 Cat1 和 Cat4 中,它们比 Cat2 和 Cat3 包含更多的源。

诀窍在于,因为坐标不完全匹配,所以我需要能够首先查看 RA 并找到最佳匹配值,然后查看相应的 Dec,并检查它是否也是最佳对应值。

例如,对于 Cat2 中的源:RA = 53.13360595,Dec = -28.0530758

类别 1:RA = 53.133496,12 月 = -27.553401 或 RA = 53.133873,十二月 = -28.054600

在这里,53.1336 等于 53.1334 和 53.1338 之间,但显然 -28.053 比 -27.553 更接近 -28.054,因此 Cat1 中的第二个选项是获胜者。

进步:

到目前为止,我已经纯粹通过肉眼将 Cat2 中的前 15 个值与 Cat1 中的值进行了匹配(command+f 尽可能多的小数位,然后使用最佳判断),但显然这对于​​跨 Cat2 和 Cat3 的所有 3400 个源来说效率极低。我只是想亲眼看看匹配的准确性如何,不幸的是,有些匹配仅到小数点后第二或第三位,而另一些则匹配到第四或第五位。

在生成散点图时,我使用了代码:

cat1 = np.genfromtext('filepath/cat1.txt', delimiter = '   ')
RA_cat1 = cat1[:,][:,0]
Dec_cat1 = cat1[:,][:,1]

然后简单地绘制 RA_cat1 与 Dec_cat1 的关系,并对我的所有目录重复此操作。

我现在的问题是,在寻找如何生成能够匹配我的坐标的代码的答案时,我看到了很多涉及将数组转换为列表的答案,但是当尝试使用

cat1list = np.array([RA_cat1, Dec_cat1])
cat1list.tolist()

我最终得到了一份表格清单;

[RA1、RA2、RA3、...、RA3000]、[Dec1、Dec2、Dec3、...、Dec3000]

而不是我认为更有帮助的;

[RA1,Dec1],[RA2,Dec2],...,[RA3000,Dec3000]。

此外,对于类似的问题,列表转换成功后最有用的答案似乎是使用字典,但我不清楚如何使用字典来产生我上面描述的那种比较。

此外,我应该提到,一旦我成功完成了这项任务,我就被要求对相当大的数据集重复该过程,我不确定有多大,但我假设可能有数万个坐标套。


对于您拥有的数据量,您可以计算每对点之间的距离度量。就像是:

def close_enough(p1, p2):
    # You may need to scale the RA difference with dec. 
    return (p1.RA - p2.RA)**2 + (p1.Dec - p2.Dec)**2) < 0.01

candidates = [(p1,p2) for p1,p2 in itertools.combinations(points, 2)
              if close_enough(p1,p2)]

对于大型数据集,您可能希望使用线扫描算法来仅计算同一邻域中的点的度量。像这样:

import itertools as it
import operator as op
import sortedcontainers     # handy library on Pypi
import time

from collections import namedtuple
from math import cos, degrees, pi, radians, sqrt
from random import sample, uniform

Observation = namedtuple("Observation", "dec ra other")

生成一些测试数据

number_of_observations = 5000
field1 = [Observation(uniform(-25.0, -35.0),     # dec
                      uniform(45.0, 55.0),       # ra
                      uniform(0, 10))            # other data
          for shop_id in range(number_of_observations)]

# add in near duplicates
number_of_dups = 1000
dups = []
for obs in sample(field1, number_of_dups):
    dDec = uniform(-0.0001, 0.0001)
    dRA  = uniform(-0.0001, 0.0001)
    dups.append(Observation(obs.dec + dDec, obs.ra + dRA, obs.other))

data = field1 + dups

算法如下:

# Note: dec is first in Observation, so data is sorted by .dec then .ra.
data.sort()

# Parameter that determines the size of a sliding declination window
# and therefore how close two observations need to be to be considered
# observations of the same object.
dec_span = 0.0001

# Result. A list of observation pairs close enough to be considered 
# observations of the same object.
candidates = []

# Sliding declination window.  Within the window, observations are
# ordered by .ra.
window = sortedcontainers.SortedListWithKey(key=op.attrgetter('ra'))

# lag_obs is the 'southernmost' observation within the sliding declination window.
observation = iter(data)
lag_obs = next(observation)

# lead_obs is the 'northernmost' observation in the sliding declination window.
for lead_obs in data:

    # Dec of lead_obs represents the leading edge of window.
    window.add(lead_obs)

    # Remove observations further than the trailing edge of window.
    while lead_obs.dec - lag_obs.dec > dec_span:
        window.discard(lag_obs)
        lag_obs = next(observation)

    # Calculate 'east-west' width of window_size at dec of lead_obs
    ra_span = dec_span / cos(radians(lead_obs.dec))
    east_ra = lead_obs.ra + ra_span
    west_ra = lead_obs.ra - ra_span

    # Check all observations in the sliding window within
    # ra_span of lead_obs.
    for other_obs in window.irange_key(west_ra, east_ra):

        if other_obs != lead_obs:
            # lead_obs is at the top center of a box 2 * ra_span wide by 
            # 1 * ra_span tall.  other_obs is is in that box. If desired, 
            # put additional fine-grained 'closeness' tests here. 
            # For example:
            #    average_dec = (other_obs.dec + lead_obs.dec) / 2
            #    delta_dec = other_obs.dec - lead_obs.dec
            #    delta_ra  = other_obs.ra - lead_obs.ra)/cos(radians(average_dec))
            # e.g. if delta_dec**2 + delta_ra**2 < threshold:
            candidates.append((lead_obs, other_obs))

在我的笔记本电脑上,它可以在不到十分之一秒的时间内找到接近点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 Python 匹配相似的坐标? 的相关文章

  • AWS Lambda 错误:无法导入模块“function_name”:没有名为“module._module”的模块

    阅读后请特别查看屏幕截图 我正在 AWS Lambda 上部署一个使用该包的 python 脚本impyla它依赖于包bitarray from impala dbapi import connect 我的Python文件名为authori
  • 在Python中解析空选项

    我有一个应用程序 允许您将事件数据发送到自定义脚本 您只需布置命令行参数并指定什么事件数据与什么参数相匹配 问题是这里没有真正的灵活性 您制定的每个选项都将被使用 但并非每个选项都必须有数据 因此 当应用程序构建要发送到脚本的字符串时 某些
  • Django 管理中的嵌套内联?

    好吧 我有一个相当简单的设计 class Update models Model pub date models DateField title models CharField max length 512 class Post mode
  • Python:我可以修改元组吗?

    我有一个 2 D 元组 实际上我以为 它是一个列表 但错误说它是一个元组 但无论如何 该元组的形式为 浮点数 val prod id 现在我有一个字典 其中包含 key gt prod id 和 value prod name 现在 我想将
  • 如何在 for 循环中跳过一些迭代

    在 python 中 我通常简单地循环遍历范围 for i in range 100 do something 但现在我想跳过循环中的几个步骤 更具体地说 我想要类似的东西continue 10 这样它就会跳过整个循环并将计数器增加 10
  • 使用 Python 连接从 FTP 检索文件

    我构建了这个简单的工具来暴力破解并连接到 ftp 服务器 import socket import ftplib from ftplib import FTP port 21 ip 192 168 1 108 file1 passwords
  • 在 python 中返回 self [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个代表对象的类 我有很多方法可以修改这个对象状态 没有明显的返回或显然没有任何返回 在 C 中 我会将所有这些方法声明为void
  • PyKCS11 不可哈希列表

    我的 python 脚本旨在获取特定 so 库中插槽 令牌的详细信息 输出如下所示 Library manufacturerID Safenet Inc Available Slots 4 Slot no 0 slotDescription
  • Unpickle 二进制文件为文本[重复]

    这个问题在这里已经有答案了 我需要对基本上如下所示的系统进行一些维护 复杂的遗留Python程序 gt 二进制pickle文件 gt 另一个复杂的遗留Python程序 这需要准确弄清楚中间 pickle 文件中的内容 我怀疑文件格式比生成和
  • 多级QTreeView

    我很难理解如何使用 QTreeView 和 QStandardItemModel 设置多级 QTree 这是我所拥有的 from PySide QtGui import import sys class MainFrame QWidget
  • 在用户提交的正则表达式中查找捕获组

    我有一个 python 应用程序 需要处理用户提交的正则表达式 出于性能考虑 我想禁止捕获组和反向引用 我的想法是使用另一个正则表达式来验证用户提交的正则表达式不包含任何命名或未命名的组捕获 如下所示 def validate user r
  • 模拟导入失败

    我该如何制作import pkg失败moduleA py 我可以打补丁pkg如果从中导入某些内容则会失败 否则不会失败 test py import os import moduleA from unittest mock import p
  • 有没有更快的方法将数字转换为名称?

    以下代码定义了映射到数字的名称序列 它的设计目的是获取一个号码并检索一个特定的名称 该类通过确保名称存在于其缓存中来进行操作 然后通过索引到其缓存中来返回名称 问题在这 如何在不存储缓存的情况下根据数字计算出名称 该名称可以被认为是一个以
  • Python Peeweeexecute_sql() 示例

    我使用 Peewee 模块作为我的项目的 ORM 我看了整个文档 没有明确的 有关如何处理 db execute sql 结果的示例 我跟踪代码 只能发现db execute sql 返回游标 有谁知道如何处理光标 例如迭代它并获取 返回复
  • 如何使用Django模板作为组件?

    我有 5 个模板 index html detail html tag html login html register html and a 基本 html 所有 5 个模板都会扩展基本 html 索引 html 详细信息 html 标签
  • 查找一个列表在另一个列表中的值的索引

    我有两个 Python 整数列表 x and y 的所有元素x出现在某处y 而且只有一次 对于每个元素x 我想知道对应值的索引y 然后我想将这些索引设置为一个列表z 下面的代码按照我刚刚描述的方式工作 然而 对于一项任务来说 这似乎有点笨拙
  • 如何通过pygit2获取当前签出的Git分支名称?

    这个问题应该与 如何获取Git中当前的分支名称 https stackoverflow com questions 6245570 how to get current branch name in git 获取 git 当前分支 标签名称
  • Mac OS 上的 pybluez 安装错误

    我尝试安装pybluez使用以下命令 pip install pybluez sudo easy install pybluez 但对于这两个命令我最终都会出错 环境 Mac OSX 10 9 1 Python 2 7 点日志 cc fno
  • jupyter run magic 将参数传递给笔记本

    当您在第一个 jupyter 笔记本 first ipynb 中时 您可以执行第二个 但如何传递参数呢 假设第二个有以下内容 xx 10 您可以从第一个调用第二个 如下所示 run second ipynb xx will print 10
  • 在大型文本文件中查找重复记录

    我在一台 Linux 机器 Redhat 上 并且有一个 11GB 的文本文件 文本文件中的每一行包含单个记录的数据 并且该行的前 n 个字符包含该记录的唯一标识符 该文件包含略多于 2700 万条记录 我需要验证文件中不存在具有相同唯一标

随机推荐

  • 如何检查传递的迭代器是否是随机访问迭代器?

    我有以下代码 它执行一些迭代器算术 template
  • Damas-Hindley-Milner 类型推理算法实现

    我正在寻找有关知名人士的信息Damas Hindley Milner 算法 https en wikipedia org wiki Hindley E2 80 93Milner type system为函数式语言进行类型推断 尤其是有关实现
  • npm 错误!错误:EPERM:不允许操作,取消链接

    操作系统 Windows 10 npm 版本 6 9 0 节点版本 12 4 0 我正在开发一个博览会应用程序 我想在我的 expo 应用程序上安装所有软件包 npm install 但是 发生了错误 17254 error Operati
  • Firestore 查询成本

    在Firestore上 我有一个社交应用程序 它将每个用户存储为文档 并根据一定距离内的用户进行查询 例如 如果用户启动了该应用程序 并且 50 英里内有 1 000 个用户 那么我是否需要为下载附近所有配置文件的 1000 次读取付费 如
  • 为什么此批处理脚本中的 FOR /f 循环评估空行?

    我正在尝试编写一个批处理脚本 该脚本获取 除其他外 计算机拥有的所有磁盘驱动器的列表 基本代码如下所示 REM Build the list of disk drives to monitor SETLOCAL enabledelayede
  • 如何将自定义对象传递到不同片段中的列表?

    所以我有我的MainActivity其中有一个BottomNavigationView 其中有 3 个不同的选项卡 当我单击它们时 它们会将我重定向到 3 个不同的片段 In FragmentA我有一个RecyclerView对于项目 每个
  • Java 线程 Random.nextLong() 返回相同的数字

    我正在使用一个 OAuth 库 它调用 new Random nextLong 来生成随机数 但它在异步调用上生成相同的随机数 我已将其范围缩小到线程 Random nextLong 以便经常返回相同的确切数字 有谁知道这是否是 Java
  • 将 OpenPGP 签名添加到已签名的文档中? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我们想要实现一个需要多人对文档进行数字签名的工作流程 如果我自己的钥匙串中有多个秘密密钥 我可以做一些简单的事情 gpg sign u userid1
  • 函数不接受 1 个参数 C++

    我的代码有问题 因为我无法弄清楚为什么会收到错误 这是代码 using namespace std void presentValue bool stringChar bool stringVal double futureValConv
  • 如何在 Makefile.am 中指定我想要 C++0x?

    目前我的项目有以下简单的树 Makefile am configure ac README src main cpp src Makefile am bin 我正在尝试遵循以下教程 http www gnu org software aut
  • window.onload = init(); 和有什么区别和 window.onload = init;

    根据我收集的信息 前者将函数返回语句的实际值分配给 onload 属性 而后者分配实际函数 并将在窗口加载后运行 但我还是不确定 感谢任何可以详细说明的人 window onload init 将 onload 事件分配给任何returne
  • 如何在sparkR中创建一个新的DataFrame

    在sparkR中我有data作为数据框 我可以附加一个条目data像这样 newdata lt filter data data column 1 我怎样才能附加多个 假设我想附加向量中的所有元素list lt c 1 6 10 11 14
  • 唯一的表单令牌禁用用户的多任务处理

    如果我想保护我的网站和用户免受跨站伪造 CSRF 攻击 我可以生成一个唯一的令牌 token md5 time rand on 每一页有一个形式 令牌在隐藏的输入字段中提交echo
  • 在Excel 2007中,为什么拖动手动水平分页会导致之前的自动分页变为手动分页?

    在过去的几天里 我一直在编写一些 Excel 2007 VBA 代码 用于管理复杂工作表中的分页符 经过多次挫折后 我刚刚解决了一个让我发疯的 跳页符 问题 并且我做出了以下发现 这让我想到了一个问题 为什么 在分页视图中 使用鼠标拖动ma
  • 如何使用 C# 执行 powershell 脚本并设置执行策略?

    我尝试结合 stackoverflow 中的两个答案 first https stackoverflow com questions 527513 execute powershell script from c sharp with co
  • HMLocation 事件示例

    我正在我的 HMHome 中实现 HMLotinEvent 我正在尝试下面的代码 但我没有得到的一件事是我不知道如何执行功能 例如如果我离开家必须关闭所有灯 我没有找到任何与操作集相关的方法 如果我错了 请纠正我 要求 我想关闭所有配件 以
  • iPad3 高分辨率视网膜显示问题

    我正在使用 Xcode 4 2 iOS SDK 5 0 为 iPad3 Retina Display 开发一个应用程序 我正在使用以下代码片段来检测视网膜 高分辨率 显示 if UIScreen mainScreen respondsToS
  • 没有函数体的函数是什么意思?

    我正在阅读打包的代码time 然后我想知道如何func After d Duration lt chan Time作品 我发现代码如下 func After d Duration lt chan Time return NewTimer d
  • SASS 如何帮助我开发响应式网页设计?

    我使用 CSS 进行设计已有多年 但我现在才刚刚学习如何使用 SASS 这是一个非常初学者的问题 所以请耐心等待 我开始研究 SASS 的原因是因为我想开发响应式网页设计 但希望有一种更好的方法来实现它 而不是为每个屏幕尺寸手动制作不同的样
  • 如何使用 Python 匹配相似的坐标?

    背景 我收到了四个数据目录 其中第一个目录 我们称之为 Cat1 给出了场 1 和 2 中无线电源的坐标 赤经和赤纬 RA 和 Dec 第二个目录 Cat2 给出了 RA和 Dec 适用于领域 1 中的无线电源和红外 IR 源 第三个目录