机器/深度学习代码中一个常见的用于图像和音频的用例是加载和操作图像或音频片段的大型数据集。这些数据集中的条目几乎总是由图像/音频段和元数据(例如类标签、培训/测试实例等)表示。
例如,在语音识别的特定用例中,数据集几乎总是由具有以下属性的条目组成:
在熊猫和/或达克-强调wav数据(在图像数据集中,这将是图像数据本身)中,建议如何表示这样的数据集?
在熊猫中,使用几招,可以在列内嵌套一个numpy数组,但这不能很好地序列化,也不能与dask一起工作。这似乎是一个非常常见的用例,但我找不到任何相关的建议。
人们也可以将这些数组序列化/反序列化为二进制格式(Uber的petastorm做像这样的东西),但这似乎没有达到诸如dask和熊猫等库的目的,因为自动化序列化是它们的核心优势之一。
欢迎对不同方法提出任何实际意见或建议。
发布于 2019-04-15 21:48:39
一种(可能很难看)的方法是修补熊猫和dask parquet API,以支持多维数组:
# 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可以处理)。
发布于 2019-04-17 18:46:41
您所拥有的数据组织听起来确实很像一个X阵列:多维数据,每个维度和变量属性都有规则的坐标。xarray允许您以类似熊猫的方式对数组进行操作(文档非常详细,因此我将不深入讨论)。请注意,xarray直接与Dask接口,这样,当您在高级数据结构上操作时,实际上是在操作下面的dask数组,从而可以计算出内核外和/或分布式。
虽然受到netCDF分层数据表示(通常存储为HDF5文件)的启发,但您可以使用许多可能的存储选项,包括扎尔,它作为云格式用于并行访问Dask想要使用的表单。
https://stackoverflow.com/questions/55315419
复制相似问题