You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Dataset的map方法返回列表而非numpy数组问题排查

问题原因与解决方案

为什么创建Dataset时numpy数组自动转为list?

Hugging Face的Dataset默认会将非原生可序列化的数据类型(比如numpy数组)转换为Python内置类型(如list)存储,这是为了兼容底层的存储格式(比如Parquet)——numpy数组无法直接被这些格式序列化,所以调用Dataset.from_dict()时会自动完成转换。

为什么map处理后依然是list?

在map函数中,你用librosa加载得到的numpy数组,同样会被Dataset自动转换为list,原因和上面一致:默认的特征类型没有指定为音频专用类型,Dataset会把数组当作普通序列处理。

解决方法

1. 创建Dataset时指定Audio特征类型

通过datasets.Audio特征类型定义音频字段,让Dataset保留numpy数组类型,同时自动处理音频数据的序列化/反序列化:

from datasets import Dataset, Audio, Value

# 定义特征结构
features = {
    "sentence": Value("string"),
    "audio": Audio(sampling_rate=16000)
}

# 创建数据集时传入features参数
sentences = list(transcript_dict.values())
audio_files = list(transcript_dict.keys())
audio_list = [{"path": file, "array": np.array([]), "sampling_rate": 16000} for file in audio_files]
data = {'sentence': sentences, 'audio': audio_list}
dataset = Dataset.from_dict(data, features=features)

此时dataset['audio'][0]['array']的类型会是numpy.ndarray。

2. 利用Audio特征自动加载音频(更推荐)

你可以省略手动编写load_audio函数的步骤,直接通过cast_column将音频字段转为Audio类型,Dataset会自动加载音频文件并返回numpy数组:

from datasets import Audio

# 将音频字段转换为Audio类型
dataset = dataset.cast_column("audio", Audio(sampling_rate=16000))

如果需要自定义音频处理逻辑,调整map函数后,返回的numpy数组也会被正确保留:

def load_audio(example):
    filepath = example["audio"]["path"]
    arr, sr = librosa.load(filepath, sr=16000)
    example["audio"]["array"] = arr
    example["audio"]["sampling_rate"] = sr
    return example

dataset = dataset.map(load_audio)

此时dataset['train']['audio'][0]['array']的类型会是numpy.ndarray。

内容的提问来源于stack exchange,提问作者user1680859

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 02:43:25