2014-02-15 22 views
0

我使用genfromtxt将csv文件导入到记录数组中。有效地从genfromtxt预处理记录数组

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

所以,我要的是,

  1. 存储第一和第二栏为整数的一个单独的二维阵列,使其更容易做计算

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

以下是我到目前为止的尝试。

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进行编码,而且我无法在网上找到正确答案。 请帮忙。

+0

http://stackoverflow.com/questions/18991814/how-do-i- load-specific-rows-from-a-txt-file-in-python –

+0

@AbidRahmanK我不这样做的原因是因为我有数百个ID,其中大部分将在稍后考虑,尽管我只考虑一个ID。 – user2418202

+0

'data'的形状和dtype是什么。我怀疑这是一个多字段dtype的一维数组。你可以按字段名称访问'列'。搜索'recarray'教程或参考页面(或SO问题)。 – hpaulj

回答

1

对于常规2D numpy的阵列,

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

演示:

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]]) 

UPDATE: 对于结构化阵列,见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')]) 
+0

对不起,您可以为演示板块添加更多解释吗? – user2418202

+0

另外,使用'data'索引不能像numpy数组那样工作,因为它是一个结构化数组。例如'data [:,1]'抛出一个错误。这就是我发布这个问题的原因。 – user2418202

+0

@ user2418202已更新 – zhangxaochen