从字符串列表创建 numpy 结构化数组

2023-12-12

我正在开发一个 python 实用程序来从第谷 2 星目录中获取数据。我正在开发的功能之一是查询目录并返回给定明星 ID(或一组明星 ID)的所有信息。

我目前正在通过循环遍历目录文件的行来执行此操作,然后尝试将行解析为 numpy 结构化数组(如果被查询)。 (请注意,如果有更好的方法来做到这一点,你可以让我知道,即使这不是这个问题的目的——我这样做是因为目录太大,无法一次将所有内容加载到内存中时间)

不管怎样,一旦我确定了我想要保留的记录,我就遇到了问题......我不知道如何将其解析为结构化数组。

例如,假设我要保留的记录是:

record = '0002 00038 1| |  3.64121230|  1.08701186|   14.1|  -23.0| 69| 82| 1.8| 1.9|1968.56|1957.30| 3|1.0|3.0|0.9|3.0|12.444|0.213|11.907|0.189|999| |         |  3.64117944|  1.08706861|1.83|1.73| 81.0|104.7| | 0.0'

现在,我尝试将其解析为具有 dtype 的 numpy 结构化数组:

        dform = [('starid', [('TYC1', int), ('TYC2', int), ('TYC3', int)]),
             ('pflag', str),
             ('starBearing', [('rightAscension', float), ('declination', float)]),
             ('properMotion', [('rightAscension', float), ('declination', float)]),
             ('uncertainty', [('rightAscension', int), ('declination', int), ('pmRA', float), ('pmDc', float)]),
             ('meanEpoch', [('rightAscension', float), ('declination', float)]),
             ('numPos', int),
             ('fitGoodness', [('rightAscension', float), ('declination', float), ('pmRA', float), ('pmDc', float)]),
             ('magnitude', [('BT', [('mag', float), ('err', float)]), ('VT', [('mag', float), ('err', float)])]),
             ('starProximity', int),
             ('tycho1flag', str),
             ('hipparcosNumber', str),
             ('observedPos', [('rightAscension', float), ('declination', float)]),
             ('observedEpoch', [('rightAscension', float), ('declination', float)]),
             ('observedError', [('rightAscension', float), ('declination', float)]),
             ('solutionType', str),
             ('correlation', float)]

这看起来应该是一件相当简单的事情,但我尝试的一切都失败了......

我试过了:

np.genfromtxt(BytesIO(record.encode()),dtype=dform,delimiter=(' ','|'))
np.genfromtxt(BytesIO(record.encode()),dtype=dform,delimiter=(' ','|'),missing_values=' ',filling_values=None)

两者都给了我

{TypeError}cannot perform accumulate with flexible type

这是没有意义的,因为它不应该进行任何积累。

我也尝试过

np.array(re.split('\|| ',record),dtype=dform)

哪个抱怨

{TypeError}a bytes-like object is required, not 'str'

和另一个变体

np.array([x.encode() for x in re.split('\|| ',record)],dtype=dform)

它不会抛出错误,但也肯定不会返回正确的结果:

[ ((842018864, 0, 0), '', (0.0, 0.0), (0.0, 0.0), (0, 0, 0.0, 0.0), (0.0, 0.0), 0, (0.0, 0.0, 0.0, 0.0), ((0.0, 0.0), (0.0, 0.0)), 0, '', '', (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), '', 0.0)...

那么我该怎么做呢?我认为 genfromtxt 选项是可行的方法(特别是因为偶尔可能会丢失数据),但我不明白为什么它不起作用。这是我必须自己编写解析器的东西吗?


抱歉,这个答案又长又散漫,但这就是弄清楚发生了什么的原因。数据类型的复杂性尤其被其长度所隐藏。


我得到了TypeError: cannot perform accumulate with flexible type当我尝试你的列表时出错delimiter。详细信息显示错误发生在LineSplitter。无需赘述,分隔符应该是一个字符(或默认的“空白”)。

来自genfromtxt docs:

分隔符:str、int 或序列,可选 用于分隔值的字符串。默认情况下,任何连续的 空格充当分隔符。整数或整数序列 也可以提供为每个字段的宽度。

The genfromtxtsplitter比string稍微强大一点.split that loadtxt用途,但不像re分离器。

至于{TypeError}a bytes-like object is required, not 'str',您为几个字段指定 dtype'str'。那是字节字符串,就像你的record是 unicode 字符串(在 Py3 中)。但你已经意识到BytesIO(record.encode()).

我喜欢测试genfromtxt案例:

record = b'....'
np.genfromtxt([record], ....)

或者更好

records = b"""one line
tow line
three line
"""
np.genfromtxt(records.splitlines(), ....)

如果我让genfromtxt推导字段类型,只使用一个分隔符,我得到 32 个字段:

In [19]: A=np.genfromtxt([record],dtype=None,delimiter='|')
In [20]: len(A.dtype)
Out[20]: 32
In [21]: A
Out[21]: 
array((b'0002 00038 1', False, 3.6412123, 1.08701186, 14.1, -23.0, 69, 82, 1.8, 1.9, 1968.56, 1957.3, 3, 1.0, 3.0, 0.9, 3.0, 12.444, 0.213, 11.907, 0.189, 999, False, False, 3.64117944, 1.08706861, 1.83, 1.73, 81.0, 104.7, False, 0.0), 
      dtype=[('f0', 'S12'), ('f1', '?'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<f8'), ... ('f26', '<f8'), ('f27', '<f8'), ('f28', '<f8'), ('f29', '<f8'), ('f30', '?'), ('f31', '<f8')])

当我们解决整个字节和分隔符问题时

np.array([x for x in re.split(b'\|| ',record)],dtype=dform)

确实运行。我现在发现您的 dform 很复杂,具有嵌套的复合字段。

但是要定义结构化数组,您需要给它一个记录列表,例如

np.array([(record1...), (record2...), ....], dtype([(field1),(field2 ),...]))

在这里,您尝试创建一条记录。我可以将您的列表包装在一个元组中,但随后我发现该长度和dform长度,66 v 17。如果算上所有子字段dform可能需要 66 个值,但我们不能只用一个元组来做到这一点。

我从未尝试过从如此复杂的数组创建数组dtype,所以我正在寻找让它发挥作用的方法。

In [41]: np.zeros((1,),dform)
Out[41]: 
array([ ((0, 0, 0), '', (0.0, 0.0), (0.0, 0.0), (0, 0, 0.0, 0.0), (0.0, 0.0), 0, (0.0, 0.0, 0.0, 0.0), ((0.0, 0.0), (0.0, 0.0)), 0, '', '', (0.0, 0.0), (0.0, 0.0), (0.0, 0.0), '', 0.0)], 
      dtype=[('starid', [('TYC1', '<i4'), ('TYC2', '<i4'), ('TYC3', '<i4')]), ('pflag', '<U'), ('starBearing', [('rightAscension', '<f8'), ('declination', '<f8')]), ('properMotion', [('rightAscension', '<f8'), ('declination', '<f8')]), ('uncertainty', [('rightAscension', '<i4'), ('declination', '<i4'), ('pmRA', '<f8'), ('pmDc', '<f8')]), ('meanEpoch', ....('solutionType', '<U'), ('correlation', '<f8')])

In [64]: for name in A.dtype.names:
    print(A[name].dtype)
   ....:     
[('TYC1', '<i4'), ('TYC2', '<i4'), ('TYC3', '<i4')]
<U1
[('rightAscension', '<f8'), ('declination', '<f8')]
[('rightAscension', '<f8'), ('declination', '<f8')]
[('rightAscension', '<i4'), ('declination', '<i4'), ('pmRA', '<f8'), ('pmDc', '<f8')]
[('rightAscension', '<f8'), ('declination', '<f8')]
int32
[('rightAscension', '<f8'), ('declination', '<f8'), ('pmRA', '<f8'), ('pmDc', '<f8')]
[('BT', [('mag', '<f8'), ('err', '<f8')]), ('VT', [('mag', '<f8'), ('err', '<f8')])]
int32
<U1
<U1
[('rightAscension', '<f8'), ('declination', '<f8')]
[('rightAscension', '<f8'), ('declination', '<f8')]
[('rightAscension', '<f8'), ('declination', '<f8')]
<U1
float64

我数了一下,有 34 个原始数据类型字段。大多数是“标量”,有些有 2-4 个术语,其中一个还有更深层次的嵌套。

如果我将前 2 个分隔空格替换为|, record.split(b'|')给我 34 个字符串。

让我们尝试一下genfromtxt:

In [79]: np.genfromtxt([record],delimiter='|',dtype=dform)
Out[79]: 
array(((2, 38, 1), '', (3.6412123, 1.08701186), (14.1, -23.0), 
   (69, 82, 1.8, 1.9), (1968.56, 1957.3), 3, (1.0, 3.0, 0.9, 3.0),
   ((12.444, 0.213), (11.907, 0.189)), 999, '', '', 
   (3.64117944, 1.08706861), (1.83, 1.73), (81.0, 104.7), '', 0.0), 
      dtype=[('starid', [('TYC1', '<i4'), ('TYC2', '<i4'), ('TYC3', '<i4')]), 
 ('pflag', '<U'), 
 ('starBearing', [('rightAscension', '<f8'), ('declination', '<f8')]),  
 ('properMotion', [('rightAscension', '<f8'), ('declination', '<f8')]),
 ('uncertainty', [('rightAscension', '<i4'), ('declination', '<i4'), ('pmRA', '<f8'), ('pmDc', '<f8')]), 
 ('meanEpoch', [('rightAscension', '<f8'), ('declination', '<f8')]),   
 ('numPos', '<i4'), 
 ('fitGoodness', [('rightAscension', '<f8'), ('declination', '<f8'), ('pmRA', '<f8'), ('pmDc', '<f8')]), 
 ('magnitude', [('BT', [('mag', '<f8'), ('err', '<f8')]), ('VT', [('mag', '<f8'), ('err', '<f8')])]), 
 ('starProximity', '<i4'), ('tycho1flag', '<U'), ('hipparcosNumber', '<U'), 
 ('observedPos', [('rightAscension', '<f8'), ('declination', '<f8')]),
 ('observedEpoch', [('rightAscension', '<f8'), ('declination', '<f8')]), 
 ('observedError', [('rightAscension', '<f8'), ('declination', '<f8')]), ('solutionType', '<U'), ('correlation', '<f8')])

这看起来几乎是合理的。genfromtxt实际上可以在复合字段之间拆分值。这就是我想要尝试的更多np.array().

因此,如果您解决了分隔符和字节/unicode问题,genfromtxt可以处理这个烂摊子。

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

从字符串列表创建 numpy 结构化数组 的相关文章

  • 将 Matplotlib 误差线放置在不位于条形中心的位置

    我正在 Matplotlib 中生成带有错误栏的堆积条形图 不幸的是 某些层相对较小且数据多样 因此多个层的错误条可能重叠 从而使它们难以或无法读取 Example 有没有办法设置每个误差条的位置 即沿 x 轴移动它 以便重叠的线显示在彼此
  • Django:按钮链接

    我是一名 Django 新手用户 尝试创建一个按钮 单击该按钮会链接到我网站中的另一个页面 我尝试了一些不同的例子 但似乎没有一个对我有用 举个例子 为什么这不起作用
  • JavaScript 中的埃拉托斯特尼筛法对大量数据无限运行

    我一直在尝试写埃拉托斯特尼筛法 http en wikipedia org wiki Sieve of EratosthenesJavaScript 中的算法 基本上我只是按照以下步骤操作 创建从 2 到 n 1 的连续整数列表 令第一个素
  • 如何使用 Ansible playbook 中的 service_facts 模块检查服务是否存在且未安装在服务器中?

    我用过service facts检查服务是否正在运行并启用 在某些服务器中 未安装特定的软件包 现在 我如何知道这个特定的软件包没有安装在该特定的服务器上service facts module 在 Ansible 剧本中 它显示以下错误
  • 如何从网页中嵌入的 Tableau 图表中抓取工具提示值

    我试图弄清楚是否有一种方法以及如何使用 python 从网页中的 Tableau 嵌入图形中抓取工具提示值 以下是当用户将鼠标悬停在条形上时带有工具提示的图表示例 我从要从中抓取的原始网页中获取了此网址 https covid19 colo
  • 以编程方式停止Python脚本的执行? [复制]

    这个问题在这里已经有答案了 是否可以使用命令在任意行停止执行 python 脚本 Like some code quit quit at this point some more code that s not executed sys e
  • 绘制方程

    我正在尝试创建一个函数 它将绘制我告诉它的任何公式 import numpy as np import matplotlib pyplot as plt def graph formula x range x np array x rang
  • 字符串数组文本格式化

    我有这个字符串 String text Address 1 Street nr 45 Address 2 Street nr 67 Address 3 Street nr 56 n Phone number 000000000 稍后将被使用
  • 在f字符串中转义字符[重复]

    这个问题在这里已经有答案了 我遇到了以下问题f string gt gt gt a hello how to print hello gt gt gt f a a gt gt gt f a File
  • python获取上传/下载速度

    我想在我的计算机上监控上传和下载速度 一个名为 conky 的程序已经在 conky conf 中执行了以下操作 Connection quality alignr wireless link qual perc wlan0 downspe
  • 使用 \r 并打印一些文本后如何清除控制台中的一行?

    对于我当前的项目 有一些代码很慢并且我无法使其更快 为了获得一些关于已完成 必须完成多少的反馈 我创建了一个进度片段 您可以在下面看到 当你看到最后一行时 sys stdout write r100 80 n I use 80覆盖最终剩余的
  • Pandas:merge_asof() 对多行求和/不重复

    我正在处理两个数据集 每个数据集具有不同的关联日期 我想合并它们 但因为日期不完全匹配 我相信merge asof 是最好的方法 然而 有两件事发生merge asof 不理想的 数字重复 数字丢失 以下代码是一个示例 df a pd Da
  • Fabric env.roledefs 未按预期运行

    On the 面料网站 http docs fabfile org en 1 10 usage execution html 给出这个例子 from fabric api import env env roledefs web hosts
  • 将图像分割成多个网格

    我使用下面的代码将图像分割成网格的 20 个相等的部分 import cv2 im cv2 imread apple jpg im cv2 resize im 1000 500 imgwidth im shape 0 imgheight i
  • 如何在seaborn displot中使用hist_kws

    我想在同一图中用不同的颜色绘制直方图和 kde 线 我想为直方图设置绿色 为 kde 线设置蓝色 我设法弄清楚使用 line kws 来更改 kde 线条颜色 但 hist kws 不适用于显示 我尝试过使用 histplot 但我无法为
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 如何在 Python 中追加到 JSON 文件?

    我有一个 JSON 文件 其中包含 67790 1 kwh 319 4 现在我创建一个字典a dict我需要将其附加到 JSON 文件中 我尝试了这段代码 with open DATA FILENAME a as f json obj js
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • Python:如何将列表列表的元素转换为无向图?

    我有一个程序 可以检索 PubMed 出版物列表 并希望构建一个共同作者图 这意味着对于每篇文章 我想将每个作者 如果尚未存在 添加为顶点 并添加无向边 或增加每个合著者之间的权重 我设法编写了第一个程序 该程序检索每个出版物的作者列表 并
  • 使用 Python 的 matplotlib 选择在屏幕上显示哪些图形以及将哪些图形保存到文件中

    我想用Python创建不同的图形matplotlib pyplot 然后 我想将其中一些保存到文件中 而另一些则应使用show 命令 然而 show 显示all创建的数字 我可以通过调用来避免这种情况close 创建我不想在屏幕上显示的绘图

随机推荐

  • hunchentoot 使用 ssl 定义-easy-handler?

    我一直使用define easy handler 我现在有一个新创建的 ssl 证书和关联的 pem 文件 但无法弄清楚 d e h 的 ssl 等效项是什么 例如 我有 hunchentoot define easy handler lo
  • C 中的免费二维数组

    当我遇到以下示例时 我正在解决一些简单的指针练习 void deallocate2D int array int nrows deallocate each row int i for i 0 i lt nrows i free array
  • 与可为空值的 SQL 相等/不相等比较

    首先采取 拼凑解决方案 哨兵方法 您的程序必须不允许输入哨兵值 select coalesce a 2147483648 coalesce b 2147483648 as is equal a little postgresism 假设您忘
  • 随机生成弯曲/波浪路径

    我有一张比视口大得多并且位于视口中心的巨大地图图像 用户可以通过拖动屏幕来浏览该图像 为了创造视差效果 我在前景中使用了巨大的云图像 当用户通过拖动探索地图时 背景和前景都会以视差方式移动 到目前为止 一切都很好 然而 我真正想做的是给云的
  • PHP递归删除函数

    我编写了用于文件夹删除的递归 PHP 函数 我想知道如何修改此函数以删除虚拟主机中的所有文件和文件夹 不包括给定的文件和文件夹名称数组 例如 cgi bin htaccess BTW 使用此函数完全删除像这样的目录调用 recursive
  • 如何在没有 Outlook 的情况下通过 VBA 发送电子邮件

    我尝试在 VBA 中通过 SMTP 发送电子邮件 但返回错误 Dim CDOmsg As CDO Message Set CDOmsg New CDO Message With CDOmsg Configuration Fields Ite
  • 我可以在“with”之外运行剧作家吗?

    我怎样才能跑 browser sync playwright chromium launch 根据文档 playwrite 必须与 with 一起运行 with sync playwrith as p 是什么导致我的浏览器在 with 结束
  • 如何同步 PL/SQL 调用的 java 方法

    我只是有一个与并发相关的问题 其逻辑流程是当客户端 称为Oracle Forms 提交请求 称为并发程序 并调用plsql过程时 该过程最终将调用java静态方法 我发现 当我同时或在很短的时间间隔 例如1秒 内提交两个请求时 会注意到一些
  • 我如何从android中的广播接收器访问数据库?

    我正在开发一个警报应用程序BroadcastReceiver 这里我需要从数据库检查警报是否打开或关闭 所以我需要在广播事件到来时检查警报的状态 我必须将数据库访问代码放入BroadcastReceiver class onReceive
  • 以编程方式自动布局不起作用

    我想以编程方式将 UIImageView 添加到视图中 并添加约束以使其垂直和水平居中 使用故事板 它可以工作 但不能以编程方式工作 class ViewController UIViewController override func v
  • Mysqli 和在插入期间绑定多个值集[重复]

    这个问题在这里已经有答案了 希望有人可以在这里给我一些见解 当必须一次将多行插入表中时 我使用了如下所示的 sql INSERT INTO some names firstName lastName VALUES Joe Smith Fre
  • mysql按类ajax更新表

    我正在尝试使用 ajax 按类而不是 id 更新行数量 我在谷歌上搜索了几个小时试图解决这个问题 但我能找到的所有东西似乎都不起作用 到目前为止我的代码是 include config php id GET id sql2 SELECT F
  • geom_bar 中的条形宽度不相等

    对于以下数据框 我想使用以下方法绘制几个条形图ggplot df lt data frame Disease c Disease1 Disease2 Disease3 Disease3 Disease3 Disease4 Disease5
  • 使用 Freebase API 时如何从 mqlread() 获取光标?

    我正在使用 Python Freebase 模块MQLREAD 使用以下查询 query cursor True id None type games game mid None 返回 100 个条目 但结果不包括 光标 如果您手动运行查询
  • 在函数参数中用更具体的类型替换“unknown”时出错

    在我正在处理的代码库中 拥有一个包含具有类型参数的函数的通用类型是有意义的unknown 然后 无论何时使用该类型 都将函数的参数类型缩小为更具体的类型 但是 这会引发如下错误 Type unknown is not assignable
  • 一页有多个 Google Analytics 4 脚本跟踪器

    Briefly 主要想法是我有一个集成了 Google Analytics 4 GA4 的网站和一个集成到该网站中的独立小部件 该网站也具有 GA4 结果 事件被发送到两个跟踪器 我如何才能将其彼此隔离 详细的 有 2 个 React We
  • 将输入文本值作为参数传递

    我想将用户输入作为参数传递到另一个页面 这是我的代码
  • Java 正则表达式抛出 java.util.regex.PatternSyntaxException:字母 g 的转义序列非法/不受支持

    我需要查看字符串中是否存在整个单词 这就是我尝试这样做的方式 if text matches word b do something 它适用于大多数单词 但以 a 开头的单词g导致错误 Exception in thread main ja
  • Cython - 动态 2D C++ 数组的 Memoryview

    目标 使用 Cython 从 2D C 字符数组获取 Memoryview 一点背景 我有一个本机 C 库 它生成一些数据并通过char 到 Cython 世界 数组在库中的初始化和操作大约是这样的 struct Result buffer
  • 从字符串列表创建 numpy 结构化数组

    我正在开发一个 python 实用程序来从第谷 2 星目录中获取数据 我正在开发的功能之一是查询目录并返回给定明星 ID 或一组明星 ID 的所有信息 我目前正在通过循环遍历目录文件的行来执行此操作 然后尝试将行解析为 numpy 结构化数