【问题标题】:genfromtxt different datatypesgenfromtxt 不同的数据类型
【发布时间】:2018-01-06 20:09:37
【问题描述】:

我正在尝试从具有不同列数的文本文件中导入数据。我知道第一列将始终是 int 并且后续 cols 将在所有文件中浮动。如何使用 dtypes 明确指定这一点?

dtypes=[int,float,float,float...] #this number will change depending on the number of columns in the file

data=np.genfromtxt(file,dtype=dtypes,delimiter='\t',skip_header=11) #read in 
the data

谢谢

【问题讨论】:

  • 你能把你输入文件的前几行和你收到的错误信息贴出来吗?
  • dtype=None 适合你吗?或者将 dtype 保留为默认浮点数并获取二维数组而不是结构化数组。
  • 我想要一个二维数组,因为稍后我想对数据进行切片并更改某些列。我可以将其保留为浮点数,但我正在编写新文件并希望通过尽可能将数字减少到 int 来尽可能减小文件大小。
  • 第一行如下所示:1 0.00000 -26.28813 -48.48795 -542.29841 .... 如果我手动输入所有列数据类型,我不会收到错误,但在某些情况下,我有更多或更少的浮点类型列。

标签: python numpy import genfromtxt


【解决方案1】:

您可以先将所有内容读取为floats,然后在知道您有多少列之后将数组转换为structured array

##input.txt:
##    1 1.4 5e23
##    2 2.3 5e-12
##    3 5.7 -1.3e-2

import numpy as np

data = np.genfromtxt('input.txt')
print(data)
print('-'*50)

colw = data.shape[1]

dtypes = [('col0', int)]+[('col{}'.format(i+1),float) for i in range(colw-1)]
print(dtypes)
print('-'*50)

converted_data = np.array([tuple(r) for r in data], dtype = dtypes)

print(converted_data)

这给出了以下输出:

[[  1.00000000e+00   1.40000000e+00   5.00000000e+23]
 [  2.00000000e+00   2.30000000e+00   5.00000000e-12]
 [  3.00000000e+00   5.70000000e+00  -1.30000000e-02]]
--------------------------------------------------
[('col0', <class 'int'>), ('col1', <class 'float'>), ('col2', <class 'float'>)]
--------------------------------------------------
[(1,  1.4,   5.00000000e+23) (2,  2.3,   5.00000000e-12)
 (3,  5.7,  -1.30000000e-02)]

在 Python 3.5 上测试

【讨论】:

    猜你喜欢
    • 2013-11-06
    • 1970-01-01
    • 2016-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2016-08-14
    相关资源
    最近更新 更多