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

Python 元组到numpy数组的列表-混合类型,unicode转换不起作用,python,numpy,unicode,numpy-ndarray,Python,Numpy,Unicode,Numpy Ndarray,我有一个“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(t

我有一个“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)]

np.array(元组,dtype=np.dtype(如链接问题(,)中所建议),将第一种类型声明为
对象

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

选择一个合理的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')])

可能重复的另一个链接问题:为什么希望它是多维的?第一个维度将是记录。命名字段将替换普通二维数组的列。@hpaulj我认为以后使用
np更容易。其中
选择“行”“我想知道数组是否是多维数组。否则它是一个元组的1D数组,如果没有像
array[:,0]这样的副本,我无法访问每个元组的第一个值。”
作为多维数组,没有办法做到这一点吗?这样,如果需要,我可以轻松地选择所有第一列字母,或者单独选择所有第二列值。因为这样,我必须迭代数组,并使用列表理解或类似方法拆分元组。我演示了如何选择字符串字段和数字字段。您可能需要阅读结构化数组。很抱歉,我将名称字段与其他内容混淆了。这很好地回答了我的问题,谢谢。小问题,将dtype设置为
int
vs
np.dtype(“int”)
In [179]: arr['label']
Out[179]: array(['A', 'Beta', 'Gamma'], dtype='<U5')
In [180]: arr['value']%2==1
Out[180]: array([ True, False,  True])
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')])