使用 genfromtxt 读取 txt 后的 Numpy 数据转换

发布于 2025-01-15 12:04:59 字数 530 浏览 1 评论 0原文

假设我创建了一个包含这三行的文件

A\tB\tC
name1\t1\t2
name2\t1.1\t2.2

,其中 \t 对应于分隔符。我使用这个 numpy 函数读取它,

data = np.genfromtxt('test.txt', delimiter='\t', dtype=None, encoding='ascii')

数据是一个形状为 (3,3) 的 numpy nd 数组。我想将其重新排列成不同的数据结构,例如

fileHeader = data[0, :] 
names = data[1:, 0]
values = data[1:, 1:]

fileHeadernames 应该是字符串列表或 np.str_ ,不带字符 ' 前导和尾随。 values 应该是 float64 的 nd 数组,不带字符 ' 开头和结尾。

我怎样才能进行这种转换?提前谢谢大家!

Let me say I created a file with this three lines

A\tB\tC
name1\t1\t2
name2\t1.1\t2.2

where \t corresponds to the delimiter. I read it using this numpy function

data = np.genfromtxt('test.txt', delimiter='\t', dtype=None, encoding='ascii')

Data is a numpy nd array with shape (3,3). I would like to rearrange it into different data structures such as

fileHeader = data[0, :] 
names = data[1:, 0]
values = data[1:, 1:]

fileHeader and names should be list of strings or np.str_ without the character ' leading and trailing.
values should be a nd array of float64 without the character ' leading and trailing.

How can I make this conversion? Thank you all in advance!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

╰ゝ天使的微笑 2025-01-22 12:04:59

您的代码,显示结果(您应该这样做!):

In [1]: txt = """A\tB\tC\t
   ...: name1\t1\t2\t
   ...: name2\t1.1\t2.2\t""".splitlines()

In [4]: data = np.genfromtxt(txt, delimiter="\t", dtype=None, encoding="ascii")
In [5]: data
Out[5]: 
array([['A', 'B', 'C', 'False'],
       ['name1', '1', '2', 'False'],
       ['name2', '1.1', '2.2', 'False']], dtype='<U5')
In [6]: fileHeader = data[0, :]
   ...: names = data[1:, 1]
   ...: values = data[1:, 1:]
In [7]: fileHeader
Out[7]: array(['A', 'B', 'C', 'False'], dtype='<U5')
In [8]: names
Out[8]: array(['1', '1.1'], dtype='<U5')
In [9]: values
Out[9]: 
array([['1', '2', 'False'],
       ['1.1', '2.2', 'False']], dtype='<U5')

那么问题是什么?

'A' 是字符串的正常显示。 False' 是尾随空字段的填充符(在最后一个 \t 之后)。

我们可以使用以下命令去掉 False

In [21]: data = data[:, :-1]
In [22]: data
Out[22]: 
array([['A', 'B', 'C'],
       ['name1', '1', '2'],
       ['name2', '1.1', '2.2']], dtype='<U5')

并将数字转换为浮点型:

In [23]: data[1:, 1:]
Out[23]: 
array([['1', '2'],
       ['1.1', '2.2']], dtype='<U5')
In [24]: data[1:, 1:].astype(float)
Out[24]: 
array([[1. , 2. ],
       [1.1, 2.2]])

Your code, showing the results (which you should have done!):

In [1]: txt = """A\tB\tC\t
   ...: name1\t1\t2\t
   ...: name2\t1.1\t2.2\t""".splitlines()

In [4]: data = np.genfromtxt(txt, delimiter="\t", dtype=None, encoding="ascii")
In [5]: data
Out[5]: 
array([['A', 'B', 'C', 'False'],
       ['name1', '1', '2', 'False'],
       ['name2', '1.1', '2.2', 'False']], dtype='<U5')
In [6]: fileHeader = data[0, :]
   ...: names = data[1:, 1]
   ...: values = data[1:, 1:]
In [7]: fileHeader
Out[7]: array(['A', 'B', 'C', 'False'], dtype='<U5')
In [8]: names
Out[8]: array(['1', '1.1'], dtype='<U5')
In [9]: values
Out[9]: 
array([['1', '2', 'False'],
       ['1.1', '2.2', 'False']], dtype='<U5')

So what's the problem?

'A' is the normal display of a string. The False' is filler for the trailing empty field (after the last \t).

We could stript off the False with:

In [21]: data = data[:, :-1]
In [22]: data
Out[22]: 
array([['A', 'B', 'C'],
       ['name1', '1', '2'],
       ['name2', '1.1', '2.2']], dtype='<U5')

and convert the numbers to float with:

In [23]: data[1:, 1:]
Out[23]: 
array([['1', '2'],
       ['1.1', '2.2']], dtype='<U5')
In [24]: data[1:, 1:].astype(float)
Out[24]: 
array([[1. , 2. ],
       [1.1, 2.2]])
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文