带有文本列表:
In [338]: txt = '''1, 1.3, abcde
...: 2, 1.3, def'''.splitlines()
结构化数组:
In [339]: np.genfromtxt(txt, dtype=None, delimiter=',', encoding=None)
Out[339]:
array([(1, 1.3, ' abcde'), (2, 1.3, ' def')],
dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<U6')])
尝试指定对象 - 每个项目都有自己的类型:
In [340]: np.genfromtxt(txt, dtype=object, delimiter=',', encoding=None)
Out[340]:
array([[b'1', b' 1.3', b' abcde'],
[b'2', b' 1.3', b' def']], dtype=object)
它不会尝试将任何字符串转换为数字。
converters 正确转换列,但由于某种原因仍然是结构化数组:
In [341]: np.genfromtxt(txt, dtype=object, delimiter=',', encoding=None, convert
...: ers={0:int, 1:float})
Out[341]:
array([(1, 1.3, b' abcde'), (2, 1.3, b' def')],
dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', 'O')])
但您可以通过列表将结构化数组转换为对象 dtype:
In [346]: np.genfromtxt(txt, dtype=None, delimiter=',', encoding=None)
Out[346]:
array([(1, 1.3, ' abcde'), (2, 1.3, ' def')],
dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<U6')])
In [347]: np.array(_.tolist(), object)
Out[347]:
array([[1, 1.3, ' abcde'],
[2, 1.3, ' def']], dtype=object)
另一种选择是自己拆分行,构建列表列表。 genfromtxt 正在做这件事,而且花里胡哨。
In [357]: lines=[]
...: for line in txt:
...: i = line.split(',')
...: x = (int(i[0]), float(i[1]), i[2].strip())
...: lines.append(x)
In [358]: lines
Out[358]: [(1, 1.3, 'abcde'), (2, 1.3, 'def')]
In [359]: np.array(lines,object)
Out[359]:
array([[1, 1.3, 'abcde'],
[2, 1.3, 'def']], dtype=object)
但请注意,您不能对该对象数组以及数值数组甚至结构化数组的数值字段进行数学运算。