我需要从list中生成一个带有命名列的numpy数组。我不知道该怎么做所以现在我使用temp txt文件将它与genfromtxt numpy函数一起使用。
my_data = np.genfromtxt('tmp.txt',delimiter='|', dtype=None, names ["Num", "Date", "Desc", "Rgh" ,"Prc", "Color", "Smb", "MType"])
如何摆脱genfromtxt因为我需要从字符串列表而不是文件生成相同的结构数组
答案 0 :(得分:1)
对于字符串列表,您可以直接使用genfromtxt
。它接受任何可以一次提供一个字符串/行的迭代。我在回答genfromtxt
个问题时一直使用这种方法,例如在
https://stackoverflow.com/a/35874408/901925
In [186]: txt='1|abc|Red|no'
In [187]: txt=[txt,txt,txt]
In [188]: A=np.genfromtxt(txt, dtype=None, delimiter='|')
In [189]: A
Out[189]:
array([(1, 'abc', 'Red', 'no'), (1, 'abc', 'Red', 'no'),
(1, 'abc', 'Red', 'no')],
dtype=[('f0', '<i4'), ('f1', 'S3'), ('f2', 'S3'), ('f3', 'S2')])
在Python3中,字节串v。常规字符串增加了复杂性。
方式genfromtxt
很容易创建结构化数组。但是有一些关键事实,直接生成它并不难。
首先,定义dtype
。有很多方法可以做到这一点。
dt = np.dtype([('name1',int),('name2',float),('name3','S10'),...])
我通常在交互式shell中测试这个表达式。
A = np.zeros((n,), dtype=dt)
创建一个正确类型的“空白”数组。尝试使用小n
,然后打印结果。
现在尝试分配值。最简单的是按字段
A['name1'] = [1,2,3]
A['name3'] = ['abc','def',...]
或通过记录
A[0] = (1, 1.23, 'str', ...)
多个记录分配带有元组列表的值。这是关键。对于二维数组,列表列表有效;但对于结构化的1d数组,元素必须是元组。
A = np.array([(1,1.2,'abc'),(2,342.,'xyz'),(3,0,'')], dtype=dt)
有时使用列表推导将列表列表转换为元组列表会有所帮助。
alist = [[1,1.0,'str'],[]...]
A[:] = [tuple(l) for l in alist]