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
相关产品推荐
相关产品推荐

