从字典可迭代对象生成字符串NumPy数组应选择什么dtype?
错误原因说明
- 第一个报错
ValueError: Must specify length when using variable-size data-type.是因为可变长度的str类型属于动态大小数据类型,使用np.fromiter时需要显式传入count参数指定迭代器的元素总数。 - 第二个报错
ValueError: setting an array element with a sequence.是因为mydict.values()迭代返回的每个元素是长度为3的字符串列表,而你指定的dtype='S3'是单字符串类型,无法直接存入列表类型的元素,因此触发错误。
解决方法
方法1:直接转列表后生成数组(最简便)
不需要硬凑np.fromiter,直接把字典的值转为列表再传入np.array即可,dtype指定3长度的Unicode字符串类型适配你的元素格式,如果你需要字节串类型可以替换为S3:
import numpy as np mydict = {'Sample1': ['0|0','0|1','0|0'], 'Sample2': ['0|0','1|1','0|0'], 'Sample3': ['0|1','0|1','1|0'] } myarray = np.array(list(mydict.values()), dtype='U3')
生成的数组形状为(3,3),完全符合你的需求。
方法2:使用np.fromiter实现
如果你必须使用np.fromiter完成转换,需要先把二维嵌套结构展平为一维迭代流,生成一维数组后再reshape为目标形状:
import numpy as np mydict = {'Sample1': ['0|0','0|1','0|0'], 'Sample2': ['0|0','1|1','0|0'], 'Sample3': ['0|1','0|1','1|0'] } # 动态计算数组维度 n_rows = len(mydict) n_cols = len(next(iter(mydict.values()))) # 构造展平的迭代器 flat_iter = (elem for lst in mydict.values() for elem in lst) # 生成数组后reshape myarray = np.fromiter(flat_iter, dtype='U3', count=n_rows*n_cols).reshape(n_rows, n_cols)
内容的提问来源于stack exchange,提问作者Whitehot
相关产品推荐
相关产品推荐

