2012-03-02 20 views
28

我跑genfromtxt象下面这样:numpy.genfromtxt产生的数组看起来像元组,而不是2D数组 - 为什么?

date_conv = lambda x: str(x).replace(":", "/") 
time_conv = lambda x: str(x) 

a = np.genfromtxt(input.txt, delimiter=',', skip_header=4, 
     usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

哪里input.txtthis gist

当我看到的结果,它是一维数组不是二维数组:

>>> np.shape(a) 
(918,) 

这似乎是元组数组来代替:

>>> a[0] 
('06/03/2006', '08:27:23', 6.4e-05, 0.000336, 0.001168, 0.002716, 0.004274, 0.004658, 0.003756, 0.002697, 0.002257, 0.002566, 0.003522, 0.004471, 0.00492, 0.005602, 0.006956, 0.008442, 0.008784, 0.006976, 0.003917, 0.001494, 0.000379, 6.4e-05) 

如果我删除了转换器来自genfromtxt的规范称其工作正常并产生二维阵列:

>>> np.shape(a) 
(918, 24) 

回答

38

什么返回被称为结构化的ndarray,参见例如:http://docs.scipy.org/doc/numpy/user/basics.rec.html。这是因为你的数据不是同质的,即不是所有的元素都具有相同的类型:数据包含字符串(前两列)和浮点数。 Numpy阵列必须是均匀的(参见here的解释)。

结构化阵列使用的元组的每个记录或行“解决”同质化这个约束,这就是返回的数组是一维的原因:一个系列的元组,但每个元组(行)由几个数据的,所以你可以把它看作行和列。不同的列可以以a['nameofcolumn']访问,在您的情况下,例如a['Julian_Day']

当移除前两列的转换器时,它返回二维数组的原因是该案例genfromtxt将所有数据都视为同一类型,并返回一个正常的ndarray(默认类型为float,但是你可以用dtype参数来指定)。

编辑:如果你想使用的列名,你可以(在只有三个,并设置skip_header)使用names参数:

a2 = np.genfromtxt("input.txt", delimiter=',', skip_header=3, names = True, dtype = None, 
        usecols=[0, 1] + radii_indices, converters={0: date_conv, 1: time_conv}) 

中,你可以做如:

>>> a2['Dateddmmyyyy'] 
array(['06/03/2006', '06/03/2006', '18/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006', '19/03/2006', '19/03/2006', 
     '19/03/2006', '19/03/2006'], 
     dtype='|S10') 
相关问题