gpt4 book ai didi

来自 genfromtxt 的 Python 2D numpy 数组

转载 作者:太空宇宙 更新时间:2023-11-04 04:49:30 25 4
gpt4 key购买 nike

我有混合字符串和数字内容的数据文件。即:

tag1 0.1 0.2 0.3
tag2 0.2 0.3 0.5
tag3 0.1 0.4 0.5
tag2 0.4 0.3 0.2
tag1 0.3 0.3 0.1
tag3 0.2 0.1 0.4

最终目标是从第 2 列和第 3 列中提取一个数组来分析(可能绘制)所有标签为“tag2”的元素。 (及其其他排列)

关于 stackoverflow 的另一个讨论表明读取文件最好由 genfromtxt 使用 dtype=None 来理解 ascii 条目。

我尝试了这个想法;

x= np.genfromtxt('data1.rpt',dtype=None)

我希望得到一个 6 行 4 列的二维数组。但事实证明,我得到了一个包含 6 行和一些意想不到的复合条目的数组。

>>> x= np.genfromtxt('data1.rpt',dtype=None)
>>> x
array([('tag1', 0.1, 0.2, 0.3), ('tag2', 0.2, 0.3, 0.5),
('tag3', 0.1, 0.4, 0.5), ('tag2', 0.4, 0.3, 0.2),
('tag1', 0.3, 0.3, 0.1), ('tag3', 0.2, 0.1, 0.4)],
dtype=[('f0', 'S4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])
>>> x.shape
(6,)
>>>

将文件处理成数组的最佳方法是什么,然后可以过滤或切片内容?

感谢您的反馈。

最佳答案

坚持使用 genfromtxt 加载的数据:

In [155]: txt = b'''tag1 0.1 0.2 0.3
...: tag2 0.2 0.3 0.5
...: tag3 0.1 0.4 0.5
...: tag2 0.4 0.3 0.2
...: tag1 0.3 0.3 0.1
...: tag3 0.2 0.1 0.4'''.splitlines()
In [156]: data = np.genfromtxt(txt, dtype=None)
...
In [157]: data
Out[157]:
array([(b'tag1', 0.1, 0.2, 0.3), (b'tag2', 0.2, 0.3, 0.5),
(b'tag3', 0.1, 0.4, 0.5), (b'tag2', 0.4, 0.3, 0.2),
(b'tag1', 0.3, 0.3, 0.1), (b'tag3', 0.2, 0.1, 0.4)],
dtype=[('f0', 'S4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

我在 py3 中,所以字节串显示为 b'tag2''

这是一个结构化数组,包含字段而不是列。

In [158]: data['f0']
Out[158]: array([b'tag1', b'tag2', b'tag3', b'tag2', b'tag1', b'tag3'], dtype='|S4')

所以带有tag2的记录是:

In [161]: mask = data['f0']==b'tag2'
In [162]: mask
Out[162]: array([False, True, False, True, False, False])
In [163]: data1=data[mask]
In [164]: data1
Out[164]:
array([(b'tag2', 0.2, 0.3, 0.5), (b'tag2', 0.4, 0.3, 0.2)],
dtype=[('f0', 'S4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8')])

我们可以从那些记录中选择数据列:

In [165]: col2 = data1['f1']
In [166]: col3 = data1['f2']
In [167]: col2
Out[167]: array([0.2, 0.4])
In [168]: col3
Out[168]: array([0.3, 0.3])

使用 genfromtxt 我可以指定 usecols。通过 2 阶段读取,我们可以跳过结构化数组。

读取一次获取标签:

In [170]: tags =np.genfromtxt(txt, usecols=[0], dtype=str)
In [171]: tags
Out[171]: array(['tag1', 'tag2', 'tag3', 'tag2', 'tag1', 'tag3'], dtype='<U4')
In [172]: mask = tags=='tag2'
In [173]: mask
Out[173]: array([False, True, False, True, False, False])

再次读取获取数据:

In [174]: data =np.genfromtxt(txt, usecols=[1,2,3])
In [175]: data
Out[175]:
array([[0.1, 0.2, 0.3],
[0.2, 0.3, 0.5],
[0.1, 0.4, 0.5],
[0.4, 0.3, 0.2],
[0.3, 0.3, 0.1],
[0.2, 0.1, 0.4]])
In [176]: data[mask,:]
Out[176]:
array([[0.2, 0.3, 0.5],
[0.4, 0.3, 0.2]])

或者使用更多的dtype,我可以用 2 个字段加载数据:

In [181]: data = np.genfromtxt(txt, dtype='U5,3f')
In [182]: data
Out[182]:
array([('tag1', [0.1, 0.2, 0.3]), ('tag2', [0.2, 0.3, 0.5]),
('tag3', [0.1, 0.4, 0.5]), ('tag2', [0.4, 0.3, 0.2]),
('tag1', [0.3, 0.3, 0.1]), ('tag3', [0.2, 0.1, 0.4])],
dtype=[('f0', '<U5'), ('f1', '<f4', (3,))])
In [183]: data['f0']
Out[183]: array(['tag1', 'tag2', 'tag3', 'tag2', 'tag1', 'tag3'], dtype='<U5')
In [184]: data['f1']
Out[184]:
array([[0.1, 0.2, 0.3],
[0.2, 0.3, 0.5],
[0.1, 0.4, 0.5],
[0.4, 0.3, 0.2],
[0.3, 0.3, 0.1],
[0.2, 0.1, 0.4]], dtype=float32)

关于来自 genfromtxt 的 Python 2D numpy 数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48714626/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com