【问题标题】:The reading of files throughout Numpy library在整个 Numpy 库中读取文件
【发布时间】:2019-08-06 01:41:01
【问题描述】:

我正在尝试使用Numpy 读取text file 中的数据,这些数据如下所示:

# Student data collected on 17 July 2014
# Researcher: Dr Wicks, University College Newbury

# The following data relate to N = 20 students. It
# has been totally made up and so therefore is 100%
# anonymous.

Subject  Sex    DOB     Height  Weight   BP     VO2max
(ID)     M/F dd/mm/yy     m       kg    mmHg   mL.kg-1.min-1
JW-1     M   19/12/95    1.82    92.4  119/76    39.3
JW-2     M   11/1/96     1.77    80.9  114/73    35.5
JW-3     F    2/10/95    1.68    69.7  124/79    29.1
JW-6     M    6/7/95     1.72    75.5  110/60    45.5
# JW-7   F   28/3/96     1.66    72.4  101/68      -
JW-9     F   11/12/95    1.78    82.1  115/75    32.3
JW-10    F   7/4/96      1.60      -    -/-      30.1
JW-11    M   22/8/95     1.72    77.2  97/63     48.8
JW-12    M   23/5/96     1.83    88.9  105/70    37.7
JW-14    F   12/1/96     1.56    56.3  108/72    26.0
JW-15    F   1/6/96      1.64    65.0  99/67     35.7
JW-16    M   10/9/95     1.63    73.0  131/84    29.9
JW-17    M   17/2/96     1.67    89.8  101/76    40.2
JW-18    M   31/7/96     1.66    75.1   -/-        -
JW-19    F   30/10/95    1.59    67.3  103/69    33.5
JW-22    F   9/3/96      1.70     -    119/80    30.9
JW-23    M   15/5/95     1.97    89.2  124/82      -
JW-24    F   1/12/95     1.66    63.8  100/78      -
JW-25    F   25/10/95    1.63    64.4   -/-      28.0
JW-26    M   17/4/96     1.69      -   121/82    39.

我阅读了sexHeight columns 并且在下面的代码中我没有遇到任何问题:

import numpy as np

fname = 'D:\\NumpyTutorial.txt'
datatype1 = np.dtype([('sex','|S1'),('height','f8')])
a = np.loadtxt(fname, dtype=datatype1, skiprows=9, usecols=(1,3))
print(a)

但是当我尝试使用以下代码阅读Weight column 时:

import numpy as np

fname = 'D:\\NumpyTutorial.txt'
datatype1 = np.dtype([('sex','|S1'),('height','f8'),('Weight','f8')])
a = np.loadtxt(fname, dtype=datatype1, skiprows=9, usecols=(1,3,4))
print(a)

我收到了这个错误:

ValueError: could not convert string to float: '-'.

1- 我该如何处理这个sign(-)。我该如何阅读这个专栏?

2- 对于sex column,我使用'|S1',对于height,使用'f8'Subject, BOD and BP columnssyntax 是什么,直到阅读它们?

3 - 如何显示此文件中的所有内容?

【问题讨论】:

  • genfromtxt 更好地处理缺失值
  • 我会去看看@hpaulj
  • @hpaulj 它给了我一个完整的列表 (b'J', nan)
  • 有什么理由不想使用 Pandas?
  • @BallpointBen 亲爱的先生,我正在学习。我还没有带熊猫。

标签: python numpy file-read


【解决方案1】:

https://docs.scipy.org/doc/numpy/reference/generated/numpy.genfromtxt.html

您可以使用 np.genfromtxt 及其 missing_valuesfilling_values 参数。我在data.txt中做了一些如下形式的虚拟数据,其中缺少一个条目。

ID      Value
0       10
1       58
2       -
3       27

然后我使用np.genfromtxt 加载了这些数据,如以下代码块所示。请注意,这只会使用所需格式检索数据——您需要自己对数据进行后处理,以确保您没有不当使用无效或丢失的条目。

在本例中,我将缺失条目中的填充值设置为-1,因为我希望我的所有值都是正数。为了数据处理,filling_values 的另一个简单选择是np.nan

import numpy as np

fname = './data.txt'
data = np.genfromtxt(fname, skip_header=1, \
        missing_values='-', filling_values=-1.) 

print(data)


###  Output:
###    [[ 0. 10.]
###     [ 1. 58.]
###     [ 2. -1.]
###     [ 3. 27.]]

您应该能够对体重和 VO2max 柱使用相同的技术。由于其格式,我不确定如何处理 BP 列 - 选择取决于您,但技术是相同的。

【讨论】:

    【解决方案2】:

    通过将您的文本复制并粘贴到文件中,我得到了这个下载。我不得不玩skip_header。我本来想使用names=True,但列标题行后面跟着一个单位行,我不能(轻易)跳过。

    In [60]: data = np.genfromtxt('stack57367863.csv', dtype=None, skip_header=8, encoding=None)                 
    In [61]: data                                                                                                
    Out[61]: 
    array([('JW-1', 'M', '19/12/95', 1.82, '92.4', '119/76', '39.3'),
           ('JW-2', 'M', '11/1/96', 1.77, '80.9', '114/73', '35.5'),
           ('JW-3', 'F', '2/10/95', 1.68, '69.7', '124/79', '29.1'),
           ...
           ('JW-26', 'M', '17/4/96', 1.69, '-', '121/82', '39.')],
          dtype=[('f0', '<U5'), ('f1', '<U1'), ('f2', '<U8'), ('f3', '<f8'), ('f4', '<U4'), ('f5', '<U6'), ('f6', '<U4')])
    

    不幸的是,只有一列被加载为浮点数; '-' 阻止其他数字列作为数字加载。

    我喜欢使用自动 dtype,但让我们尝试一个显式的:

    In [62]: dt=[('subject', 'U10'),('sex','U2'),('dob','U10'),('height','f'),('weight','f'),('bp','U10'),('vo2','f')]                                                                                                
    In [63]: np.dtype(dt)                                                                                        
    Out[63]: dtype([('subject', '<U10'), ('sex', '<U2'), ('dob', '<U10'), ('height', '<f4'), ('weight', '<f4'), ('bp', '<U10'), ('vo2', '<f4')])
    In [64]: data = np.genfromtxt('stack57367863.csv', dtype=dt, 
        skip_header=8, encoding=None)                   
    In [65]: data                                                                                                
    Out[65]: 
    array([('JW-1', 'M', '19/12/95', 1.82, 92.4, '119/76', 39.3),
           ('JW-2', 'M', '11/1/96', 1.77, 80.9, '114/73', 35.5),
           ('JW-3', 'F', '2/10/95', 1.68, 69.7, '124/79', 29.1),
           ('JW-6', 'M', '6/7/95', 1.72, 75.5, '110/60', 45.5),
           ('JW-9', 'F', '11/12/95', 1.78, 82.1, '115/75', 32.3),
           ('JW-10', 'F', '7/4/96', 1.6 ,  nan, '-/-', 30.1),
           ('JW-11', 'M', '22/8/95', 1.72, 77.2, '97/63', 48.8),
           ('JW-12', 'M', '23/5/96', 1.83, 88.9, '105/70', 37.7),
           ('JW-14', 'F', '12/1/96', 1.56, 56.3, '108/72', 26. ),
           ('JW-15', 'F', '1/6/96', 1.64, 65. , '99/67', 35.7),
           ('JW-16', 'M', '10/9/95', 1.63, 73. , '131/84', 29.9),
           ('JW-17', 'M', '17/2/96', 1.67, 89.8, '101/76', 40.2),
           ('JW-18', 'M', '31/7/96', 1.66, 75.1, '-/-',  nan),
           ('JW-19', 'F', '30/10/95', 1.59, 67.3, '103/69', 33.5),
           ('JW-22', 'F', '9/3/96', 1.7 ,  nan, '119/80', 30.9),
           ('JW-23', 'M', '15/5/95', 1.97, 89.2, '124/82',  nan),
           ('JW-24', 'F', '1/12/95', 1.66, 63.8, '100/78',  nan),
           ('JW-25', 'F', '25/10/95', 1.63, 64.4, '-/-', 28. ),
           ('JW-26', 'M', '17/4/96', 1.69,  nan, '121/82', 39. )],
          dtype=[('subject', '<U10'), ('sex', '<U2'), ('dob', '<U10'), 
              ('height', '<f4'), ('weight', '<f4'), ('bp', '<U10'), ('vo2', '<f4')])
    

    按名称访问字段:

    In [66]: data['height']                                                                                      
    Out[66]: 
    array([1.82, 1.77, 1.68, 1.72, 1.78, 1.6 , 1.72, 1.83, 1.56, 1.64, 1.63,
           1.67, 1.66, 1.59, 1.7 , 1.97, 1.66, 1.63, 1.69], dtype=float32)
    In [67]: data['weight']                                                                                      
    Out[67]: 
    array([92.4, 80.9, 69.7, 75.5, 82.1,  nan, 77.2, 88.9, 56.3, 65. , 73. ,
           89.8, 75.1, 67.3,  nan, 89.2, 63.8, 64.4,  nan], dtype=float32)
    

    “-”被渲染为np.nan

    使用missing_values 参数我得到dtype=None 工作:

    In [78]: data = np.genfromtxt('stack57367863.csv', dtype=None, 
        skip_header=8, encoding=None, missing_values='-')                                                                                                 
    In [79]: data                                                                                                
    Out[79]: 
    array([('JW-1', 'M', '19/12/95', 1.82, 92.4, '119/76', 39.3),
           ('JW-2', 'M', '11/1/96', 1.77, 80.9, '114/73', 35.5),
           ('JW-3', 'F', '2/10/95', 1.68, 69.7, '124/79', 29.1),
           ('JW-6', 'M', '6/7/95', 1.72, 75.5, '110/60', 45.5),
           ('JW-9', 'F', '11/12/95', 1.78, 82.1, '115/75', 32.3),
           ('JW-10', 'F', '7/4/96', 1.6 ,  nan, '-/-', 30.1),
           ('JW-11', 'M', '22/8/95', 1.72, 77.2, '97/63', 48.8),
           ...
           ('JW-26', 'M', '17/4/96', 1.69,  nan, '121/82', 39. )],
          dtype=[('f0', '<U5'), ('f1', '<U1'), ('f2', '<U8'), ('f3', '<f8'), 
               ('f4', '<f8'), ('f5', '<U6'), ('f6', '<f8')])
    

    【讨论】:

    • 非常感谢您的帮助,先生。非常感谢。
    猜你喜欢
    • 2010-11-20
    • 2012-05-10
    • 1970-01-01
    • 2011-07-04
    • 2011-03-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-04
    相关资源
    最近更新 更多