numpy数组的元组列表 - 混合类型,unicode转换不起作用

时间:2018-06-18 02:29:16

标签: python numpy unicode numpy-ndarray

我有一个元组列表" text,integer"格式,其中文本是unicode,来自使用utf-8编码打开的文件。

我试图将列表转换为numpy多维数组,并且类型保持正确。

使用普通np.arraynp.asarray,将所有内容转换为unicode或U1

tuples = [("A",1),("B",2)]
np.array(tuples)
>>> [['A' '1']
    ['B' '2']]

指定我想要的类型给我一个空白字符串而不是多维:

np.array(tuples, dtype=np.dtype("U,int"))
>>> [('', 1) ('', 2)]

除非我为unicode指定了多个字符,因为我的文本长度可变,所以我无法做到这一点。这也不是多维的。

np.array(tuples, dtype=np.dtype("<U99,int"))
>>> [('A', 1) ('B', 2)]

如何将元组列表转换为具有整数和字符串格式的numpy数组?此外,最终,我将在第二列上执行np.where()并检查值是否大于例如50,因此适用于下一步的解决方案将是理想的。谢谢!

编辑:理想情况下,结果应该是一个多维数组,以便在需要时可以自行选择各列

2 个答案:

答案 0 :(得分:1)

选择合理的unicode字符串长度并不难。

In [172]: alist = [('A',1),('Beta', 2), ('Gamma', 3)]
例如,

获取列表中字符串的长度:

In [173]: dt1 = np.array([row[0] for row in alist]).dtype
In [174]: dt1
Out[174]: dtype('<U5')
In [175]: dt = np.dtype([('label',dt1),('value', int)])
In [176]: dt
Out[176]: dtype([('label', '<U5'), ('value', '<i8')])

In [177]: arr = np.array(alist, dt)
In [178]: arr
Out[178]: 
array([('A', 1), ('Beta', 2), ('Gamma', 3)],
      dtype=[('label', '<U5'), ('value', '<i8')])

使用名称字段:

In [179]: arr['label']
Out[179]: array(['A', 'Beta', 'Gamma'], dtype='<U5')
In [180]: arr['value']%2==1
Out[180]: array([ True, False,  True])

通常我们不需要多维结构化数组。

如果数据在csv样式文件中,我们可以让genfromtxt选择字符串字段大小:

In [181]: txt = """A 1
     ...: Beta 2
     ...: Gamma 3"""
In [182]: data = np.genfromtxt(txt.splitlines(), dtype=None,encoding=None)
In [183]: data
Out[183]: 
array([('A', 1), ('Beta', 2), ('Gamma', 3)],
      dtype=[('f0', '<U5'), ('f1', '<i8')])

答案 1 :(得分:0)

根据关联问题(this articlenumpy recarray strings of variable length)的建议,将第一个类型声明为object

np.array([("A", 1), ("B", 2)], dtype=[('str', np.object), ('int', np.int)])