我有一个元组列表" 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,因此适用于下一步的解决方案将是理想的。谢谢!
编辑:理想情况下,结果应该是一个多维数组,以便在需要时可以自行选择各列
答案 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 article,numpy recarray strings of variable length)的建议,将第一个类型声明为object
:
np.array([("A", 1), ("B", 2)], dtype=[('str', np.object), ('int', np.int)])