跳转到主要内容

casacore的箭头绑定

项目描述

arcae实现了比成熟的python-casacore包更有限的子集功能。它绕过了python-casacore中的一些现有限制,从而提供了对CASA格式的安全、多线程访问,因此能够导出到Apache Arrow和Zarr等较新的本地云格式。

理由

casacore和Python绑定提供了对CASA表数据系统(CTDS)以及在该系统中创建的测量集的访问。截至casacore 3.5.0,CTDS存在以下限制:

解决这些问题的努力可能是一项重大工作,需要在整个CTDS系统中进行侵入性更改。

自CTDS开发以来,已经开发出Apache Arrow和Zarr等新的开源格式,这些格式适合表示射电天文学数据。

  • Apache Arrow项目定义了一种编程语言可移植的内存列存储格式。

  • 将CTDS数据转换为Arrow相对简单,以下列出了某些限制。

  • 很容易在不同的语言之间转换Arrow表。

  • 一旦转换为Apache Arrow格式,数据就很容易存储在现代的云原生磁盘格式中,如Parquet和Zarr。

  • 在C++层将CASA表格转换为Arrow可以避免全局解释器锁(GIL)。

  • 对非线程安全CASA表格的访问仅限于包含单个线程的线程池。

  • 这还允许我们用C++编写天文学例程,可能绕过CASA测量服务器中的线程安全和GIL问题。

限制

Arrow支持一维数组和嵌套结构。

  1. 固定形状的多维数据(即观测数据)目前表示为嵌套的FixedSizeListArray

  2. 可变形状的多维数据(即子表数据)目前表示为嵌套的ListArray

  3. 复杂数值表示为两个浮点数的额外嵌套的FixedSizeListArray

  4. 目前,通过在Arrow数组上调用to_numpy来在上述数据之间进行转换并不是一件 trivial的事情(这里特意重复),但是从任一API重新解释底层数据缓冲区相对容易。这在getcolputcol函数中是透明完成的(请参见下文的使用示例)。

未来,FixedShapeTensorArrayVariableShapeTensorArray将为表示多维数据提供更直观的结构。在Apache Arrow中支持复杂数值的第一类支持需要实现Arrow本身内的一个C++扩展类型

一些其他边缘情况尚未实现,但经过一些思考可以实现。

  • 具有无约束秩(ndim == -1)的列,其实际行具有不同的维度。实际具有相同秩的无约束秩列也得到照顾。

  • 尚不能处理TpRecord列。最简单的方法是将这些行转换为JSON,并作为字符串存储。

  • 尚不能处理TpQuantity列。可以将其表示为运行时参数化的Arrow DataType。

安装

为Linux和MacOSX提供二进制轮,适用于x86_64和arm64架构。

$ pip install arcae

用法

使用Arrow表格的示例用法

import json
from pprint import pprint

import arcae
import pyarrow as pa
import pyarrow.parquet as pq

# Obtain (partial) Apache Arrow Table from a CASA Table
casa_table = arcae.table("/path/to/measurementset.ms")
arrow_table = casa_table.to_arrow()        # read entire table
arrow_table = casa_table.to_arrow(index=(slice(10, 20),)
assert isinstance(arrow_table, pa.Table)

# Print JSON-encoded Table and Column keywords
pprint(json.loads(arrow_table.schema.metadata[b"__arcae_metadata__"]))
pprint(json.loads(arrow_table.schema.field("DATA").metadata[b"__arcae_metadata__"]))

pq.write_table(arrow_table, "measurementset.parquet")

python-casacore复制了一些读取和写入功能,并增加了对一些NumPy高级索引的支持。

casa_table = arcae.table("/path/to/measurementset.ms", readonly=False)
# Get rows 10 and 2, and channels 16 to 32, and all correlations
data = casa_table.getcol("DATA", index=([10, 2], slice(16, 32), None)
# Write some modified data back
casa_table.putcol("DATA", data + 1*1j, index=([10, 2], slice(16, 32), None)

请参阅测试用例以获取更多使用案例。

将测量集导出到Arrow Parquet数据集

安装可选的applications扩展。

pip install arcae[applications]

然后,将可用的导出脚本

$ arcae export /path/to/the.ms --nrow 50000
$ tree output.arrow/
output.arrow/
├── ANTENNA
   └── data0.parquet
├── DATA_DESCRIPTION
   └── data0.parquet
├── FEED
   └── data0.parquet
├── FIELD
   └── data0.parquet
├── MAIN
   └── FIELD_ID=0
       └── PROCESSOR_ID=0
           ├── DATA_DESC_ID=0
              ├── data0.parquet
              ├── data1.parquet
              ├── data2.parquet
              └── data3.parquet
           ├── DATA_DESC_ID=1
              ├── data0.parquet
              ├── data1.parquet
              ├── data2.parquet
              └── data3.parquet
           ├── DATA_DESC_ID=2
              ├── data0.parquet
              ├── data1.parquet
              ├── data2.parquet
              └── data3.parquet
           └── DATA_DESC_ID=3
               ├── data0.parquet
               ├── data1.parquet
               ├── data2.parquet
               └── data3.parquet
├── OBSERVATION
   └── data0.parquet

这些数据可以加载到Arrow数据集中

>>> import pyarrow as pa
>>> import pyarrow.dataset as pad
>>> main_ds = pad.dataset("output.arrow/MAIN")
>>> spw_ds = pad.dataset("output.arrow/SPECTRAL_WINDOW")

词源

名词:arca f (属格 arcae); 第一变位法 一个箱子,盒子,保险箱(用于存储物品的安全地方或形状相似的东西)

发音:ar-ki

项目详情


下载文件

下载适用于您的平台的文件。如果您不确定要选择哪一个,请了解更多关于安装包的信息。

源分布

arcae-0.2.5.tar.gz (89.0 kB 查看哈希值)

上传时间 源码

构建版本

arcae-0.2.5-cp312-cp312-manylinux_2_28_x86_64.whl (32.8 MB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.28+ x86-64

arcae-0.2.5-cp312-cp312-manylinux_2_28_aarch64.whl (29.9 MB 查看哈希值)

上传时间 CPython 3.12 manylinux: glibc 2.28+ ARM64

arcae-0.2.5-cp312-cp312-macosx_11_0_x86_64.whl (15.7 MB 查看哈希值)

上传时间 CPython 3.12 macOS 11.0+ x86-64

arcae-0.2.5-cp312-cp312-macosx_11_0_arm64.whl (13.4 MB 查看哈希值)

上传时间 CPython 3.12 macOS 11.0+ ARM64

arcae-0.2.5-cp311-cp311-manylinux_2_28_x86_64.whl (32.7 MB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.28+ x86-64

arcae-0.2.5-cp311-cp311-manylinux_2_28_aarch64.whl (29.8 MB 查看哈希值)

上传时间 CPython 3.11 manylinux: glibc 2.28+ ARM64

arcae-0.2.5-cp311-cp311-macosx_11_0_x86_64.whl (15.7 MB 查看哈希值)

上传时间 CPython 3.11 macOS 11.0+ x86-64

arcae-0.2.5-cp311-cp311-macosx_11_0_arm64.whl (13.4 MB 查看哈希值)

上传时间 CPython 3.11 macOS 11.0+ ARM64

arcae-0.2.5-cp310-cp310-manylinux_2_28_x86_64.whl (32.7 MB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.28+ x86-64

arcae-0.2.5-cp310-cp310-manylinux_2_28_aarch64.whl (29.8 MB 查看哈希值)

上传时间 CPython 3.10 manylinux: glibc 2.28+ ARM64

arcae-0.2.5-cp310-cp310-macosx_11_0_x86_64.whl (15.6 MB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ x86-64

arcae-0.2.5-cp310-cp310-macosx_11_0_arm64.whl (13.4 MB 查看哈希值)

上传于 CPython 3.10 macOS 11.0+ ARM64

由以下支持