numpy.genfromtxt产生的元组看起来像元组,而不是2D数组 - 为什么?

rob*_*ntw 34 python import numpy genfromtxt

我的运行genfromtxt方式如下:

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})
Run Code Online (Sandbox Code Playgroud)

这个要点input.txt来自哪里.

当我查看结果时,它是一维数组而不是二维数组:

>>> np.shape(a)
(918,)
Run Code Online (Sandbox Code Playgroud)

它似乎是一组元组:

>>> 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)
Run Code Online (Sandbox Code Playgroud)

如果我从genfromtxt调用中删除转换器规范,它可以正常工作并生成一个2D数组:

>>> np.shape(a)
(918, 24)
Run Code Online (Sandbox Code Playgroud)

jor*_*ris 46

返回的内容称为结构化ndarray,请参见此处:http://docs.scipy.org/doc/numpy/user/basics.rec.html.这是因为您的数据不是同类的,即并非所有元素都具有相同的类型:数据包含两个字符串(前两列)和浮点数.Numpy数组必须是同质的(参见此处的解释).

结构化数组通过对每个记录或行使用元组来"解决"这种同质性约束,这就是返回数组为1D的原因:一系列元组,但每个元组(行)由多个数据组成,因此您可以将其视为行和列.a['nameofcolumn']在您的情况下,可以访问不同的列,例如a['Julian_Day'].

它在删除前两列的转换器时返回2D数组的原因是,在这种情况下,genfromtxt查看相同类型的所有数据,并返回正常的ndarray(默认类型为float,但您可以指定该dtype参数).

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

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})
Run Code Online (Sandbox Code Playgroud)

你可以这样做:

>>> 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')
Run Code Online (Sandbox Code Playgroud)