【问题标题】:Python generate from list instead of GenfromtextPython 从列表而不是 Genfromtxt 生成
【发布时间】:2023-03-19 11:43:01
【问题描述】:

我需要从列表中生成一个带有命名列的 numpy 数组。我不知道该怎么做,所以现在我使用 temp txt 文件将它与 genfromtxt numpy 函数一起使用。

my_data = np.genfromtxt('tmp.txt',delimiter='|', dtype=None, names ["Num", "Date", "Desc", "Rgh" ,"Prc", "Color", "Smb", "MType"])

如何摆脱 genfromtxt 因为我需要从字符串列表而不是文件生成相同的结构数组

【问题讨论】:

标签: python numpy


【解决方案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 中,字节字符串与常规字符串相比更加复杂。

值列表

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', ...)

多条记录是用一个元组列表赋值的。那是关键。对于二维数组,列表列表有效;但是对于结构化的一维数组,元素必须是元组。

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]

【讨论】:

  • 但是有没有一个函数可以创建与 genfromtxt 相同的数组但从列表而不是文件
  • 您的列表是什么样的?我描述的值列表或字符串列表(文件行)?
  • 是的,它是一个带有分隔符 | 的字符串列表。就像这样: 1|abc|Red|no 这是一个字符串的示例,其他字符串的结构相同
  • 对不起,我错过了文本中的“字符串列表”;查看我的编辑
  • 非常感谢 hpaulj
猜你喜欢
  • 2014-03-17
  • 2014-08-17
  • 1970-01-01
  • 2013-07-22
  • 2021-10-29
  • 2019-07-24
  • 1970-01-01
  • 2013-09-05
  • 2013-03-02
相关资源
最近更新 更多