如何用NumPy生成指定嵌套格式的描述数组并保持原序?
问题描述
我有一个包含句子ID和descriptions值的NumPy数据集,希望生成格式为[['value'], ['value']]的有序列表,仅包含描述值,且需保持原顺序以便后续与ID匹配。
目前遇到的问题是无法得到该目标格式,实际得到的是['value', 'value'],请问原因是什么?
原始输入数据
[ [UUID('11ea1bca-eb95-4dc8-8cb9-c7d70a806679') 'the quick brown fox'] [UUID('339619ab-bd17-401f-82c8-a927145d52cf')' jumps over the lazy dog'] ]
尝试代码
description = np.array([description[1] for description in chunk])
实际输出
['the quick brown fox','jumps over the lazy dog']
期望输出
[['the quick brown fox'],['jumps over the lazy dog']]
环境信息
- Python 3.8
- 原始列表来自
np.array_split(book_information, chunk_size),对其进行分块遍历
原因分析与解决方案
原因
你写的列表推导式[description[1] for description in chunk]提取的是每个子数组里的单个字符串元素,把这些元素直接转成NumPy数组后,得到的是一维数组(对应Python的一维列表),自然不是每个元素单独成子列表的二维结构。
解决方案
有几种方式可以实现目标格式:
修改列表推导式,嵌套子列表
把每个提取的元素包裹进子列表,再转成NumPy数组:description = np.array([[desc[1]] for desc in chunk])这样生成的就是符合要求的二维数组。
用NumPy索引直接提取二维子数组
不用列表推导式,直接用NumPy索引语法提取第二列并保留二维结构:description = chunk[:, [1]][:, [1]]表示提取所有行的第2个元素(索引从0开始),且保持二维结构,比列表推导式更高效。对现有一维数组做reshape转换
如果已经得到了一维数组,可以用reshape转成二维:# 先得到一维数组 desc_1d = np.array([desc[1] for desc in chunk]) # 转为目标二维结构 description = desc_1d.reshape(-1, 1)reshape(-1,1)会自动计算行数,固定列数为1,刚好匹配需求。
内容的提问来源于stack exchange,提问作者MarkK
相关产品推荐
相关产品推荐

