如何将混合数据类型的文件读入 Python 中的 numpy 数组?

How to read file with mixed data type into a numpy array in Python?

如何在 Python 中将混合数据类型的文件读入 numpy 数组?

我是 python 新手。我正在尝试将具有混合数据类型的现有文件读取到 numpy 数组中。

文件data.txt的内容(如果逗号不是很好的符号,可以用space代替):

   ,'A','B','C','D'
'A',  0,  3,  5, -1
'B',  3,  0,  1,  6
'C',  5,  1,  0,  2
'D', -1,  6,  2,  0

预期输出的numpy数组如下:

array([[None,'A','B','C','D'],
       ['A',  0,  3,  5, -1 ],
       ['B',  3,  0,  1,  6 ],
       ['C',  5,  1,  0,  2 ],
       ['D', -1,  6,  2,  0 ]])

您可以使用 pandas.read_csv:

>>> import pandas as pd

>>> df = pd.read_csv('data.txt', index_col=0, sep=',')
>>> print(df)
     'A'  'B'  'C'  'D'

'A'    0    3    5   -1
'B'    3    0    1    6
'C'    5    1    0    2
'D'   -1    6    2    0

然后您可以使用 .values:

访问底层数组
>>> df.values
array([[ 0,  3,  5, -1],
       [ 3,  0,  1,  6],
       [ 5,  1,  0,  2],
       [-1,  6,  2,  0]], dtype=int64)

至少据我所知,不可能将该文件读入普通(非对象)二维数组,因为记录数组要求任何列遵循相同的类型。虽然它可以用于倒数第二行 (str, int, int, int, int),但不能用于第一行 (NoneType, str, str, str, str)。至少使用 pandas 您可以将第一行和第一列解释为可以具有不同类型的索引。

然而,如果您不需要第一行和第一列,您可以使用 np.loadtxt:

>>> import numpy as np

>>> np.loadtxt('myfile.txt', delimiter=',', skiprows=1, usecols=[1,2,3,4], dtype=int)
array([[ 0,  3,  5, -1],
       [ 3,  0,  1,  6],
       [ 5,  1,  0,  2],
       [-1,  6,  2,  0]])