从genfromtxt有效地预处理记录数组

时间:2014-02-15 02:59:46

标签: python numpy

我使用genfromtxt将csv文件导入记录数组。

它的第一列和第二列是经度和纬度,所以是整数,其他四列是名称和ids,所以它们可以定义为字符串。

所以我想要的是,

  1. 将第一列和第二列存储为单独的2D整数数组,以便更容易进行计算

  2. 通过在第四列中按id过滤行来考虑行的子集而不是整行。目前我只考虑一个组(id == 19),但我想为所有其他ID做这个。

  3. 到目前为止,我的尝试是什么。

    from numpy import genfromtxt
    import numpy as np
    
    data = genfromtxt('filename.csv', delimiter=",", dtype=None) 
    ket_idx = ()
    latlon = []
    
    for rows in xrange(len(data)):
        if data[rows][4] == 19:
            ket_idx += (rows, )
    
    for k_i in ket_idx:
        print data[k_i][4]
    

    我不知道该为1做什么,我认为我的做法2非常低效。 这几乎是我第一次使用Python编写代码,而且我无法在线找到正确的答案。 请帮忙。

1 个答案:

答案 0 :(得分:1)

对于常规2D numpy数组,

  1. 使用data[:,:2]获取第一列和第二列。
  2. 使用boolean index arraysdata[data[:,4]==19]
  3. 演示:

    In [405]: a #"a" is a 2D ndarray
    Out[405]: 
    array([[1, 2],
           [2, 3],
           [4, 2]])
    
    In [406]: a[:,1]==2
    Out[406]: array([ True, False,  True], dtype=bool)
    
    In [407]: a[a[:,1]==2]
    Out[407]: 
    array([[1, 2],
           [4, 2]])
    

    <强>更新 对于结构化数组,请参阅how to manipulate it

    1)按名称使用data.dtype.names或地址列:

    如,

    In [556]: d
    Out[556]: 
    array([(1, 2, 'foo', 'bar', 19), (11, 22, 'foo', 'bar', 18),
           (3, 4, 'foo', 'xxx', 19)], 
          dtype=[('lat', '<i4'), ('long', '<i4'), ('name1', 'S10'), ('name2', 'S10'), ('id', '<i4')])
    
    In [557]: d[['lat', 'long']] #get the first column if you know their names
    Out[557]: 
    array([(1, 2), (11, 22), (3, 4)], 
          dtype=[('lat', '<i4'), ('long', '<i4')])
    
    In [558]: d[list(d.dtype.names[:2])] #get the first column by index
    Out[558]: 
    array([(1, 2), (11, 22), (3, 4)], 
          dtype=[('lat', '<i4'), ('long', '<i4')])
    

    2)类似于屏蔽索引常规数组:

    如,

    In [562]: d[d['id']==19]
    Out[562]: 
    array([(1, 2, 'foo', 'bar', 19), (3, 4, 'foo', 'xxx', 19)], 
          dtype=[('lat', '<i4'), ('long', '<i4'), ('name1', 'S10'), ('name2', 'S10'), ('id', '<i4')])