我的代码如下:
file_ = open('file.txt', 'r')
lines = file_.readlines()
data = []
for row in lines:
temp = row.split()
data.append(np.array(temp).astype(np.float64))
我想将数组中的每一项都强制转换为float,除了最后一项,我想保持它为字符串。
我该怎么做?
不可以,没有将同一数组中的元素强制转换为不同类型的函数。与常规Python列表不同,numpy数组是同构的,并且存储具有固定物理记录大小的元素,因此数组的每个元素必须始终具有相同的类型。
您可以单独处理字符串,只将数字部分解析为numpy数组:
for row in lines:
temp = row.split()
numbers = temp[:-1]
stringbit = temp[-1]
data.append(np.array(numbers).astype(np.float64))
或者,如果您的数据非常一致,并且每行总是具有相同的类型结构,您可能可以使用更复杂的numpy dtype和numpy。
你可能还会发现一只熊猫。DataFrame更适合处理这类异构数据。
一个有有用细节的相关问题:NumPy数组/矩阵的混合类型
你可以使用recarrays
如果您的行是具有类似数据的记录,您可以创建一个自定义dtype来做您想做的事情。在这种情况下,同质数据类型的要求是元素的数量是恒定的,并且最终字符串中的字符数有一个上限。
下面是一个假设字符串只包含ASCII字符的示例:
max_len = 10
dtype = np.dtype([('c1', np.float_), ('c2', np.float_), ('c3', np.float_), ('str', f'S{max_len}')])
row = [(10.0, 1.2, 4.5, b'abc')]
result = np.array(row, dtype)
如果您不想单独命名每个float列,您可以将该字段作为子数组:
dtype = np.dtype([('flt', np.float_, 3), ('str', f'S{max_len}')])
row = [([10.0, 1.2, 4.5], b'abc')]
如果字符串的长度不是已知的,则可以在该字段中使用对象dtype,并简单地存储一个引用。
尽管这是可能的,但您可能会发现将浮点数装入一个数组而将字符串装入另一个数组更简单。我通常发现使用同质内建的dtype数组比使用recarrays更简单。