Python 如何强制numpy.genfromtxt生成非结构化numpy数组?

Python 如何强制numpy.genfromtxt生成非结构化numpy数组?,python,numpy,genfromtxt,Python,Numpy,Genfromtxt,在Python 3中,我执行以下操作: s = StringIO(u"1,1.3,abcde\n2,1.3,test") data = numpy.genfromtxt(s, dtype=[int,float,'U10'], delimiter=',', names=None) 我得到: array([(1, 1.3, 'abcde'), (2, 1.3, 'test')], dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '&l

在Python 3中,我执行以下操作:

s = StringIO(u"1,1.3,abcde\n2,1.3,test")
data = numpy.genfromtxt(s, dtype=[int,float,'U10'], delimiter=',', names=None)
我得到:

array([(1, 1.3, 'abcde'), (2, 1.3, 'test')],
      dtype=[('f0', '<i8'), ('f1', '<f8'), ('f2', '<U10')])
可能吗?

您得到的是一个“结构化数组”,它优于“常规数组”,因为它支持异构数据类型。其中两列是数字,一列是文本,因此将数据折叠成无结构的纯
numpy.ndarray
是没有意义的。但如果您愿意,您可以:

numpy.array(data.tolist())
这将为您提供一个包含所有字符串的
ndarray

array([['1', '1.3', 'abcde'],
       ['2', '1.3', 'test']], dtype='<U32')
数组([['1',1.3',abcde'],
['2','1.3','test']],dtype='您得到的是一个“结构化数组”,它优于“常规数组”,因为它支持异构数据类型。您的两列是数字,但一列是文本,因此将数据折叠为无结构的纯
numpy.ndarray
,实际上没有意义。但如果您愿意,您可以:

numpy.array(data.tolist())
这将为您提供一个包含所有字符串的
ndarray

array([['1', '1.3', 'abcde'],
       ['2', '1.3', 'test']], dtype='<U32')
数组([['1',1.3',abcde'],
['2','1.3','test']],dtype='带有文本列表:

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 [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')])
它不尝试将任何字符串转换为数字

转换器
将列向右转换,但由于某些原因,仍然会生成结构化数组:

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 [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')])
但请注意,您不能对该对象数组以及数字数组甚至结构化数组的数字字段进行计算。

使用文本列表:

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 [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')])
它不尝试将任何字符串转换为数字

转换器
将列向右转换,但由于某些原因,仍然会生成结构化数组:

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 [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')])
但请注意,您不能对该对象数组以及数字数组甚至结构化数组的数字字段进行计算。

“常规numpy数组”只有一种数据类型。如果您尝试最后一段代码,所有对象都将是字符串“常规numpy数组”只有一种数据类型。如果尝试最后一段代码,所有对象都将是字符串