我使用genfromtxt
将csv文件导入记录数组。
它的第一列和第二列是经度和纬度,所以是整数,其他四列是名称和ids,所以它们可以定义为字符串。
所以我想要的是,
将第一列和第二列存储为单独的2D整数数组,以便更容易进行计算
通过在第四列中按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 :(得分:1)
对于常规2D numpy数组,
data[:,:2]
获取第一列和第二列。data[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]])
<强>更新强> 对于结构化数组,请参阅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')])