将数组指定为字典中键的值

时间:2014-03-13 07:24:09

标签: python arrays numpy dictionary

我有一个包含不同数据的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

2 个答案:

答案 0 :(得分:1)

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

我想您希望以一种易于使用的方式加载这些列表数据,并利用numpy的功能。

然后,我认为你有两种选择。

使用PANDAS

Pandas(此处为documentation)是一个非常完整的程序包,它使用numpy来处理标记的数据(以便列和行有一个名称,而不仅仅是一个位置索引)

使用熊猫的想法是:

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上的所有数据,您可以访问切片和索引。如果您想要标记类别(并且您不喜欢第一个选项),您可以按照最后一段代码构建数组字典:

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

答案 1 :(得分:0)

编辑:我发现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