【问题标题】:How can I convert a ndarray/multi-dimensional array to a parquet file?如何将 ndarray/多维数组转换为镶木地板文件?
【发布时间】:2021-10-15 23:18:03
【问题描述】:

我有一个 数组,我想将它保存到 parquet 文件中,以传递给我正在构建的 ML 模型。 我的数组有 159573 个数组,每个数组有 1395 个数组。

这是我的数据示例:

[[0.         0.         0.         ... 0.24093714 0.75547471 0.74532781]
 [0.         0.         0.         ... 0.24093714 0.75547471 0.74532781]
 [0.         0.         0.         ... 0.24093714 0.75547471 0.74532781]
 ...
 [0.         0.         0.         ... 0.89473684 0.29282009 0.29277004]
 [0.         0.         0.         ... 0.89473684 0.29282009 0.29277004]
 [0.         0.         0.         ... 0.89473684 0.29282009 0.29277004]]

我尝试使用此代码进行转换:

import pyarrow as pa
pa_table = pa.table({"data": Main_x})
pa.parquet.write_table(pa_table, "full_data.parquet")

我得到了这个堆栈跟踪:

5 frames
/usr/local/lib/python3.7/dist-packages/pyarrow/table.pxi in pyarrow.lib.table()

/usr/local/lib/python3.7/dist-packages/pyarrow/table.pxi in pyarrow.lib.Table.from_pydict()

/usr/local/lib/python3.7/dist-packages/pyarrow/array.pxi in pyarrow.lib.asarray()

/usr/local/lib/python3.7/dist-packages/pyarrow/array.pxi in pyarrow.lib.array()

/usr/local/lib/python3.7/dist-packages/pyarrow/array.pxi in pyarrow.lib._ndarray_to_array()

/usr/local/lib/python3.7/dist-packages/pyarrow/error.pxi in pyarrow.lib.check_status()

ArrowInvalid: only handle 1-dimensional arrays

我想知道是否有办法将多维数组保存到镶木地板?

【问题讨论】:

    标签: numpy parquet pyarrow


    【解决方案1】:

    Parquet/Arrow 不适合保存此类数据。 它更擅长处理具有明确定义的架构和特定列名称和类型的表格数据。 特别是numpy conversion API 只支持一维数据。

    话虽如此,您可以轻松地将二维 numpy 数组转换为镶木地板,但您需要先对其进行按摩。

    您最好的选择是将其保存为一个表,其中包含 n 列,每列 m 双倍。

    import numpy as np
    import pyarrow as pa
    import pyarrow.parquet as pq
    
    matrix = np.random.rand(10, 100)
    arrays = [
        pa.array(col)  # Create one arrow array per column
        for col in matrix
    ]
    
    table = pa.Table.from_arrays(
        arrays,
        names=[str(i) for i in range(len(arrays))] # give names to each columns
    )
    # Save it:
    pq.write_table(table, 'table.pq')
    
    # Read it back as numpy:
    table_from_parquet = pq.read_table('table.pq')
    matrix_from_parquet = table_from_parquet.to_pandas().T.to_numpy()
    
    

    中间 table 有 10 列和 100 行:

    |         0 |          1 |          2 |         3 |          4 |          5 |          6 |         7 |         8 |          9 |
    |----------:|-----------:|-----------:|----------:|-----------:|-----------:|-----------:|----------:|----------:|-----------:|
    | 0.45774   | 0.92753    | 0.252345   | 0.982261  | 0.503732   | 0.543526   | 0.22827    | 0.347948  | 0.654259  | 0.152693   |
    | 0.287813  | 0.793067   | 0.972282   | 0.739047  | 0.0689906  | 0.102235   | 0.110273   | 0.166839  | 0.907481  | 0.427729   |
    | 0.523928  | 0.511737   | 0.473887   | 0.771607  | 0.707633   | 0.276726   | 0.943073   | 0.788174  | 0.305119  | 0.511876   |
    | 0.67563   | 0.947449   | 0.895125   | 0.246979  | 0.703503   | 0.256418   | 0.93113    | 0.116715  | 0.330746  | 0.566704   |
    | 0.471526  | 0.45332    | 0.546384   | 0.822873  | 0.333542   | 0.518933   | 0.229525   | 0.381977  | 0.893204  | 0.932781   |
    ...
    

    【讨论】:

    • 哇,这太酷了,谢谢!只是为了确认我的理解。您从 numpy 获取每个列名并将其转换为字符串(因为没有名称,所以它是基于数值的字符串)然后写表?感谢代码示例,它非常有用,我确认它们完全匹配 = (Main_x==matrix_from_parquet).all() 导致“True”
    • Numpy 没有列名的概念,所以我只是使用每列的索引(“0”、“1”、“2”、...)生成名称。我还必须为每一列创建一个 pyarrow 数组。然后我将数组和名称放在一起创建一个表。
    • 什么数据格式适合存储大型(~300GB)numpy 数组?
    猜你喜欢
    • 2014-11-25
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 2017-01-18
    • 2020-08-13
    • 2018-11-09
    • 2016-04-16
    • 1970-01-01
    相关资源
    最近更新 更多