代码之家  ›  专栏  ›  技术社区  ›  Lobstw

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

  •  0
  • Lobstw  · 技术社区  · 8 年前

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

    我正在尝试将列表转换为类型保持正确的numpy多维数组。

    使用正常 np.array np.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 回复  |  直到 8 年前
        1
  •  1
  •   hpaulj    8 年前

    选择一个合理的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')])
    
        2
  •  0
  •   AGN Gazer    8 年前

    如相关问题所建议( numpy recarray strings of variable length , Automatic string length in recarray ),将第一个类型声明为 object :

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