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

2024-09-22 16:29:48 发布

您现在位置:Python中文网/ 问答频道 /正文

在Python3中,我做到了:

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数组,没有如下名称:

array([[1, 1.3, 'abcde'], 
        [2, 1.3, 'test']])

有可能吗


Tags: testnumpydatanamesfloatarraypython3int
2条回答

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

numpy.array(data.tolist())

这将为您提供一个包含所有字符串的ndarray

array([['1', '1.3', 'abcde'],
       ['2', '1.3', 'test']], dtype='<U32')

但这很少是个好主意。如果我们有更多的背景,我们也许能够提出一个更好的整体方法

使用文本列表:

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')])

但您可以通过列表将结构化数组转换为对象数据类型:

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)

但是请注意,您不能对该对象数组和数字数组进行数学运算,甚至不能对结构化数组的数字字段进行数学运算

相关问题 更多 >