numpy.genfromtxt 生成看起来像元组的数组,而不是二维数组——为啥?

Posted

技术标签:

【中文标题】numpy.genfromtxt 生成看起来像元组的数组,而不是二维数组——为啥?【英文标题】:numpy.genfromtxt produces array of what looks like tuples, not a 2D array—why?numpy.genfromtxt 生成看起来像元组的数组,而不是二维数组——为什么? 【发布时间】:2012-03-21 00:31:29 【问题描述】:

我正在运行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 来自this 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)

【问题讨论】:

【参考方案1】:

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

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

删除前两列的转换器时返回二维数组的原因是,在这种情况下,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)

你可以做的例如:

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

【讨论】:

以上是关于numpy.genfromtxt 生成看起来像元组的数组,而不是二维数组——为啥?的主要内容,如果未能解决你的问题,请参考以下文章

Numpy函数学习--genfromtxt函数

NumPy之:使用genfromtxt导入数据

Python练手,numpy.genfromtxt

numpy.genfromtxt:不明确的分隔符?

Python科学计算——Numpy.genfromtxt

带有 NumPy loadtxt() 和 genfromtxt 的“dtype”都有哪些可用数据类型?