首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >dask和熊猫数据中嵌套的numpy数组

dask和熊猫数据中嵌套的numpy数组
EN

Stack Overflow用户
提问于 2019-03-23 15:36:57
回答 2查看 1.2K关注 0票数 10

机器/深度学习代码中一个常见的用于图像和音频的用例是加载和操作图像或音频片段的大型数据集。这些数据集中的条目几乎总是由图像/音频段和元数据(例如类标签、培训/测试实例等)表示。

例如,在语音识别的特定用例中,数据集几乎总是由具有以下属性的条目组成:

  • 扬声器ID (字符串)
  • 成绩单(串)
  • 试验数据(bool)
  • Wav数据(numpy数组)
  • 数据集名称(字符串)
  • ..。

在熊猫和/或达克-强调wav数据(在图像数据集中,这将是图像数据本身)中,建议如何表示这样的数据集?

在熊猫中,使用几招,可以在列内嵌套一个numpy数组,但这不能很好地序列化,也不能与dask一起工作。这似乎是一个非常常见的用例,但我找不到任何相关的建议。

人们也可以将这些数组序列化/反序列化为二进制格式(Uber的petastorm做像这样的东西),但这似乎没有达到诸如dask和熊猫等库的目的,因为自动化序列化是它们的核心优势之一。

欢迎对不同方法提出任何实际意见或建议。

EN

回答 2

Stack Overflow用户

发布于 2019-04-15 21:48:39

一种(可能很难看)的方法是修补熊猫和dask parquet API,以支持多维数组:

代码语言:javascript
运行
复制
# these monkey-patches into the pandas and dask I/O API allow us to save multi-dimensional numpy
# arrays# in parquet format by serializing them into byte arrays

from dask import dataframe as dd
import pandas as pd
from io import BytesIO

def _patched_pd_read_parquet(*args, **kwargs):
    return _orig_pd_read_parquet(*args, **kwargs).applymap(
        lambda val: np.load(BytesIO(val)) if isinstance(val, bytes) else val)
_orig_pd_read_parquet = pd.io.parquet.PyArrowImpl.read
pd.io.parquet.PyArrowImpl.read = _patched_pd_read_parquet

def _serialize_ndarray(arr: np.ndarray) -> bytes:
    if isinstance(arr, np.ndarray):
        with BytesIO() as buf:
            np.save(buf, arr)
            return buf.getvalue()
    return arr

def _deserialize_ndarray(val: bytes) -> np.ndarray:
    return np.load(BytesIO(val)) if isinstance(val, bytes) else val

def _patched_pd_write_parquet(self, df: pd.DataFrame, *args, **kwargs):
    return _orig_pd_write_parquet(self, df.applymap(_serialize_ndarray), *args, **kwargs)
_orig_pd_write_parquet = pd.io.parquet.PyArrowImpl.write
pd.io.parquet.PyArrowImpl.write = _patched_pd_write_parquet

def _patched_dask_read_pyarrow_parquet_piece(*args, **kwargs):
    return _orig_dask_read_pyarrow_parquet_piece(*args, **kwargs).applymap(_deserialize_ndarray)
_orig_dask_read_pyarrow_parquet_piece = dd.io.parquet._read_pyarrow_parquet_piece
dd.io.parquet._read_pyarrow_parquet_piece = _patched_dask_read_pyarrow_parquet_piece

def _patched_dd_write_partition_pyarrow(df: pd.DataFrame, *args, **kwargs):
    return _orig_dd_write_partition_pyarrow(df.applymap(_serialize_ndarray), *args, **kwargs)
_orig_dd_write_partition_pyarrow = dd.io.parquet._write_partition_pyarrow
dd.io.parquet._write_partition_pyarrow = _patched_dd_write_partition_pyarrow

然后,您可以使用问题中指定的技巧在熊猫单元格(内存中)中获得嵌套数组,而上面的代码将充当一个“穷人”的编解码器,将数组序列化为字节流(不同的序列化方案,如parquet可以处理)。

票数 1
EN

Stack Overflow用户

发布于 2019-04-17 18:46:41

您所拥有的数据组织听起来确实很像一个X阵列:多维数据,每个维度和变量属性都有规则的坐标。xarray允许您以类似熊猫的方式对数组进行操作(文档非常详细,因此我将不深入讨论)。请注意,xarray直接与Dask接口,这样,当您在高级数据结构上操作时,实际上是在操作下面的dask数组,从而可以计算出内核外和/或分布式。

虽然受到netCDF分层数据表示(通常存储为HDF5文件)的启发,但您可以使用许多可能的存储选项,包括扎尔,它作为云格式用于并行访问Dask想要使用的表单。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55315419

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档