切片存在于numpy数组中的元组中的列

时间:2013-04-21 18:32:10

标签: python list numpy tuples

我已将文本文件导入numpy数组,如下所示。

data=np.genfromtxt(f,dtype=None,delimiter=',',names=None)

其中f包含我的csv文件的路径

现在数据包含以下内容。

array([(534, 116.48482, 39.89821, '2008-02-03 00:00:49'),
   (650, 116.4978, 39.98097, '2008-02-03 00:00:02'),
   (675, 116.31873, 39.9374, '2008-02-03 00:00:04'),
   (715, 116.70027, 40.16545, '2008-02-03 00:00:45'),
   (2884, 116.67727, 39.88201, '2008-02-03 00:00:48'),
   (3799, 116.29838, 40.04533, '2008-02-03 00:00:37'),
   (4549, 116.48405, 39.91403, '2008-02-03 00:00:42'),
   (4819, 116.42967, 39.93963, '2008-02-03 00:00:43')],
    dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S19')])

如果我现在尝试列切片,即使用

提取第一列或第二列
data[:,0]

它说“索引太多”。我发现这是由于它的存储方式。所有行都存储为元组而不是列表/数组。 我想过使用“最丑”的方式来执行切片而不必使用迭代。那就是将每行中的元组转换为列表并将其放回到numpy数组中。像这样的东西

data=np.asarray([list(i) for i in data])

但是对于上面的问题,我正在丢失每列的数据类型。每个元素都将存储为字符串,而不是整数或浮点数,这在前一种情况下会自动检测到

现在,如果我想切片而不必使用迭代,那么有什么办法吗?

2 个答案:

答案 0 :(得分:5)

为您创建的np.genfromtext不是一个元组数组,它​​们具有object dtype,而是一个记录数组。你可以从奇怪的dtype中看出来:

dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S19')]

该列表中的每个元组都保存相应字段的名称,其dtype <i4是一个小字节4字节整数,<f8一个小字节8字节float和{{1一个19个字符长的字符串。您可以按名称访问字段:

S19

答案 1 :(得分:2)

也许对于您的情况,您可以使用zip

import numpy as np

x = np.array([(534, 116.48482, 39.89821, '2008-02-03 00:00:49'),
              (650, 116.4978, 39.98097, '2008-02-03 00:00:02'),
              (675, 116.31873, 39.9374, '2008-02-03 00:00:04'),
              (715, 116.70027, 40.16545, '2008-02-03 00:00:45'),
              (2884, 116.67727, 39.88201, '2008-02-03 00:00:48'),
              (3799, 116.29838, 40.04533, '2008-02-03 00:00:37'),
              (4549, 116.48405, 39.91403, '2008-02-03 00:00:42'),
              (4819, 116.42967, 39.93963, '2008-02-03 00:00:43')],
              dtype=[('f0', '<i4'), ('f1', '<f8'), ('f2', '<f8'), ('f3', 'S19')])

b = zip(*x)

结果:

>>> b[0]
(534, 650, 675, 715, 2884, 3799, 4549, 4819)
>>> b[1]
(116.48482, 116.4978, 116.31873, 116.70027, 116.67726999999999, 116.29837999999999, 116.48405, 116.42967)
相关问题