python - 将 numpy recarray 转换为 pyarrow.Table
问题描述
我想将 numpy recarray 转换为 pyarrow.Table。有推荐的方法吗?
通过 pandas DataFrame 进行转换是最简单的:
ra = ... # some recarray
T1 = pa.Table.from_pandas(pd.DataFrame(ra))
但似乎它应该增加不必要的开销。我已经尝试过from_pydict
,它似乎工作,虽然有点hacky:
ra = ... # some recarray
T2 = pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
如果我尝试在一个有点现实的例子中对这两个时间进行计时,则该from_pydict
方法要快得多:
c:\>python
Python 3.8.5 (default, Sep 3 2020, 21:29:08) [MSC v.1916 64 bit (AMD64)] :: Anaconda, Inc. on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import pandas as pd
>>> import pyarrow as pa
>>> import numpy as np
>>>
>>> np.random.seed(123)
>>> rectype = np.dtype([('timestamp', np.int64),
... ('category', np.int32),
... ])
>>> nrows = 20000
>>> rawvals = np.random.randint(1000,size=(nrows,2))
>>> ra = np.array([tuple(row) for row in rawvals], dtype=rectype)
>>> T1 = pa.Table.from_pandas(pd.DataFrame(ra))
>>> T2 = pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
>>> (T1.to_pandas() == T2.to_pandas()).all()
timestamp True
category True
dtype: bool
>>>
>>> import timeit
>>> def f1():
... return pa.Table.from_pandas(pd.DataFrame(ra))
...
>>> def f2():
... return pa.Table.from_pydict({k:ra[k] for k in ra.dtype.fields.keys()})
...
>>> timeit.timeit(f1,number=1000)
1.4761637000000007
>>> timeit.timeit(f2,number=1000)
0.05712700000000126
from_pydict
在这种情况下是更好的方法吗?它有什么缺点吗?
解决方案
推荐阅读
- kubernetes - 私有云上的 Kubernetes 静态 IP 入口
- mysql - Querying required training courses with this example SQL schema
- java - 将 CredentialMatcher 附加到 iniRealm 时引发 Shiro 警告
- python - 游标使用 mySQL 在 python 中执行实时数据
- c# - 无法对空引用 C# Excel 执行运行时绑定
- .net-core - 是否可以在控制台应用程序中为 .NET Core 主机进程 (dotnet.exe) 设置标题?
- ios - iOS Swift SpriteKit:如何使子精灵节点的位置和动作与其父精灵节点相同?
- html - 如何在没有 javascript 的情况下隐藏 URL 中的参数?
- apache-kafka-streams - 流线程计算
- c# - ILSpy 生成的代码