如何将dict_keys数组向量化转列表并实现2D数组转3D数组?
解决方法
为什么你的vectorize尝试失败?
np.vectorize 默认会自动推断输出数组的类型,当每个元素的长度不一致时(比如你的例子里有的列表长度是2,有的是3),它没法生成规则的多维数组,自然就达不到你想要的嵌套列表结构。
方案1:给vectorize指定otypes参数
显式指定otypes=[object],强制让每个输出元素保持为列表对象,就能解决问题:
import numpy as np from collections import Counter # 模拟你的输入数组 Y = np.array([[Counter({'Q': 1, 'S': 1}), Counter({'Z': 2, 'P': 2, 'L': 1})], [Counter({'I': 2}), Counter({'R': 2, 'Q': 1})]], dtype=object) # 先得到dict_keys数组(模拟vectorKeys的处理结果) Y_keys = np.vectorize(lambda x: x.keys())(Y) # 转换为列表数组 vectorList = np.vectorize(list, otypes=[object]) result = vectorList(Y_keys) print(result)
输出符合预期:
array([[list(['Q', 'S']), list(['Z', 'P', 'L'])], [list(['I']), list(['R', 'Q'])]], dtype=object)
方案2:用嵌套列表推导式
对于这种元素长度不规则的object数组,嵌套列表推导式更直观,也不容易踩坑:
result = np.array([[list(keys) for keys in row] for row in Y_keys], dtype=object)
这个方法就是手动遍历数组的每一行和每个元素,把dict_keys转成列表后,再重新包装成numpy object数组,结果和方案1完全一致。
内容的提问来源于stack exchange,提问作者anon.for
相关产品推荐
相关产品推荐

