Numpy数组中字符串与浮点数类型冲突:创建保留类型二维数组遇阻
如何用Numpy创建保留子数组原数据类型的二维数组
先梳理你的场景:你有不同类型的子数组,想要把它们组合成一个Numpy数组,同时保留每个子数组的原始数据类型,但尝试的两种方法都没能成功。
首先看你的初始数据:
a = ['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'] # 字符串类型的子数组 b = [0.0, 0.1] # 浮点类型的子数组 c = [0.0, 0.2] d = [0.0, 0.3] e = [0.0, 0.4]
为什么你的尝试会失败?
直接使用
np.array([a, b, c, d, e]):
Numpy默认会创建同构数组,也就是要求所有元素必须是同一类型。这里字符串类型的优先级更高,所以所有浮点数组被强制转换成了字符串类型,不符合你的需求。自定义结构化dtype的错误:
你定义的dt = np.dtype([('f1', np.str), ('f2', np.float), ...])属于结构化数据类型,它的设计目标是让数组的每个元素包含多个不同类型的字段(比如每个元素是一个带5个字段的结构体),而不是让数组的每一行是不同类型的子数组。当你传入[a,b,c,d,e]时,Numpy会尝试把a拆分成f1到f5的字段,显然a里的字符串无法转换成浮点数,因此触发报错:
ValueError: could not convert string to float: '(0.0 | 0.0 | 0.0)'
正确的解决方案
要实现你的需求,你需要创建一个**dtype=object的Numpy数组**。这种数组的每个元素可以是任意Python对象,因此能容纳不同类型的子数组,同时完整保留它们的原始类型:
import numpy as np a = ['(0.0 | 0.0 | 0.0)', '(0.0 | 0.0 | 0.1)'] b = [0.0, 0.1] c = [0.0, 0.2] d = [0.0, 0.3] e = [0.0, 0.4] # 创建object类型的数组 final = np.array([a, b, c, d, e], dtype=object)
你可以验证一下类型是否符合预期:
# 第一个子数组的元素是字符串 print(type(final[0][0])) # 输出:<class 'str'> # 第二个子数组的元素是浮点数 print(type(final[1][0])) # 输出:<class 'numpy.float64'>
这样就完全达成了你的目标,每个子数组都保留了自己的原始数据类型。
内容的提问来源于stack exchange,提问作者Luis Figueiredo
相关产品推荐
相关产品推荐

