【问题标题】:Assigning arrays as values for a key in a dictionary将数组分配为字典中键的值
【发布时间】:2014-03-13 07:24:09
【问题描述】:

我有一个包含不同数据的 dat 文件。该文件有不同的数字,排列在 7 列中,用两个空格分隔。是否可以使用数组读取和提取每列的数据并将数据分配给字典中的键。是否可以将 numpy 数组分配为字典中键的值?

dat.file 有这样的数字:

 1  -0.8  92.3  2.8  150  0  0 
 2  -0.7  99.3  1.9  140  0  0 
 3  -0.3  96.4  2.5  120  0  0 
 4  -0.3  95.0  3.1  130  0  0 
 5  -0.8  95.7  3.1  130  0  0 
 6  -0.5  95.0  2.1  120  0  0 
 7  -0.7  90.9  3.6  110  0  0 
 8  -0.6  85.7  2.6  80  0  0 
 9  -0.7  85.7  3.1  60  0  0 
 10  -1.2  85.6  3.6  50  0  8 

我首先阅读了所有行,然后我用空格作为分隔符来分割每一行的值。我试图将每列中的值分配给字典中的相应键,但这不起作用。我想我必须将值放入数组中,然后以某种方式将数组放入字典中?

def read_data(filename):
    infile = open(filename, 'r')

for line in infile.readlines():
    data = {'hour': None, 'temperature': None, 'humidity':
            None, 'wind_speed':
            None, 'wind_direction':
            None, 'direct_flux': None, 'diffuse_flux': None}
    lines = line.split()

    data['hour'] = lines[0]
    data['temperature'] = lines[1]
    data['humidity'] = lines[2]
    data['wind_speed'] = lines[3]
    data['wind_direction'] = lines[4]
    data['direct_flux'] = lines[5]
    data['diffuse_flux'] = lines[6]
return data

【问题讨论】:

  • 尝试读取文件,然后transpose
  • 请展示您的尝试,以及文件示例
  • 短答案是,长答案取决于您的代码和数据格式。假设数据是规则的并且格式一致,那么是的,它可以被解析并且创建一个 dict 或 numpy 数组是微不足道的
  • 请给出一个示例 dat 文件,其中包含您要提取的数据和您期望的相关字典。
  • 没有一个答案让你满意吗?如果是这种情况,你能解释一下你需要什么吗? :)

标签: python arrays numpy dictionary


【解决方案1】:

编辑:我意识到 numpy 数组是一种特定的科学数据结构。我没有使用它们,但假设将以下列表(及其附加操作)转换为 numpy 数组是微不足道的。

你是对的。字典包含(键,值)对。不接受格式为(键、值、值、...、值)的条目。使用 list() 作为值(如您所建议的)是一种解决方案。现在请注意,索引对应于数据所在的行号。

data = {'hour': None, 'temperature': None, 'humidity':
        None, 'wind_speed':
        None, 'wind_direction':
        None, 'direct_flux': None, 'diffuse_flux': None}

# For each key, initialize a list as its value.
for key in data:
  data[key] = list()

for line in infile.readlines():
  lines = line.split()

  # we simply append into the list this key references.
  data['hour'].append(lines[0])
  data['temperature'].append(lines[1])
  data['humidity'].append(lines[2])
  data['wind_speed'].append(lines[3])
  data['wind_direction'].append(lines[4])
  data['direct_flux'].append(lines[5])
  data['diffuse_flux'].append(lines[6])
return data

【讨论】:

    【解决方案2】:

    我不太确定你的要求是否正确,但我会尽力回答。

    我猜你想以一种你可以轻松使用的方式加载这些表格数据,并利用numpy 的功能。

    那么,我认为你有两个选择。

    使用熊猫

    Pandas(这里是documentation)是一个非常完整的包,它使用numpy让你处理labelled数据(这样列和行都有一个名称,而不仅仅是位置索引)

    使用 pandas 的想法是:

    import pandas as pd
    df = pd.read_csv('data.tab', sep="  ", index_col=0, header=None,
                names=['hour', 'temp', 'hum', 'w_speed', 'w_direction',
                       'direct_flux','diffuse_flux'])
    df
    
          temp   hum  w_speed  w_direction  direct_flux  diffuse_flux
    hour                                                             
    1     -0.8  92.3      2.8          150            0             0
    2     -0.7  99.3      1.9          140            0             0
    3     -0.3  96.4      2.5          120            0             0
    4     -0.3  95.0      3.1          130            0             0
    5     -0.8  95.7      3.1          130            0             0
    6     -0.5  95.0      2.1          120            0             0
    7     -0.7  90.9      3.6          110            0             0
    8     -0.6  85.7      2.6           80            0             0
    9     -0.7  85.7      3.1           60            0             0
    10    -1.2  85.6      3.6           50            0             8
    

    或者,如果您将列名作为文件的第一行:

    import pandas as pd
    df = pd.read_csv('data.tab', sep="  ", index_col=0)
    

    如果你还没有听说过这个库,而你正在管理这种数据,我认为真的值得仔细看看。

    仅使用 Numpy

    如果您不需要对这些数据做太多事情,或者不会再这样做或其他什么,那么获得 Pandas 可能有点过分......

    无论如何,你总是可以从 numpy 读取列表文件

    import numpy as np
    array = np.loadtxt("data.tab", delimiter=" ")
    

    它将忽略注释行(默认为#),您也可以跳过第一行,依此类推。

    现在您将拥有array 上的所有数据,您可以对其进行切片和索引访问。如果您想要标记类别(并且您不喜欢第一个选项),您可以按照代码的最后一个 sn-p 构建您的数组字典:

    data = {}
    headers = ['hour', 'temp', 'hum', 'w_speed', 'w_direction', 'direct_flux', 
               'diffuse_flux']
    for i in xrange(len(headers)):
        data[header[i]] = array[:,i]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-28
      • 1970-01-01
      • 1970-01-01
      • 2019-01-23
      • 2016-10-09
      • 1970-01-01
      • 1970-01-01
      • 2021-04-08
      相关资源
      最近更新 更多