numpy.genfromtxt生成了一个看起来像元组而不是2D数组的数组——为什么会这样?

43
我在以下方式下运行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})

其中input.txt来自于这个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的调用中删除转换器规范,它将正常工作并生成一个2D数组:

>>> np.shape(a)
(918, 24)
1个回答

54
返回的是一个称为 结构化ndarray 的东西,可以在这里了解到更多信息:http://docs.scipy.org/doc/numpy/user/basics.rec.html。这是因为你的数据不是同质的,即不是所有元素都有相同的类型:数据包含字符串(前两列)和浮点数。Numpy数组必须是同质的(可以在这里找到解释)。
结构化数组通过为每个记录或行使用元组来“解决”这种同质性约束,这就是返回的数组为什么是1D的原因:一系列元组,但每个元组(行)由几个字段组成,因此您可以将其视为行和列。不同的列可以用 a['column名称'] 访问,例如a['Julian_Day']
当删除前两列的转换器时,它返回一个2D数组的原因是,在这种情况下,genfromtxt将所有数据视为相同类型,并返回正常的ndarray(默认类型是float,但是您可以使用 dtype 参数指定类型)。 编辑:如果您想使用列名,请使用 names 参数(并将 skip_header 设置为 3):
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')

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接