Python从列表生成而不是Genfromtext

时间:2016-03-13 04:39:44

标签: python numpy

我需要从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因为我需要从字符串列表而不是文件生成相同的结构数组

1 个答案:

答案 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]