Numpy.loadtxt将数据作为数组数组而不是多维数组导入

时间:2013-09-29 15:18:42

标签: python arrays numpy

我有一个csv文件,它有前三列这样的

2011,12,25,...
2011,12,26....
2011,12,27,...
...

这些列基本上是年,月和日。其他列包含字符串。总共有100行和6列。我使用numpy.loadtxt使用

将其转换为数组
input = numpy.loadtxt('file.csv', dtype='i4, i4, i4, S4, S4, S4', delimiter=',')

问题:据我所知,这个loadtxt操作应该返回一个形状为100x6的数组。但是,这会返回一个100x1数组,每个元素都是1x6的数组。

我希望这是100x6的普通2D数组。我在网上查了一些资源。似乎由于csv数据中的某些列包含字符串,我必须使用dtype参数,这导致输入是数组的一维数组而不是二维数组。我已经尝试了这些网站中给出的一些示例,只要CSV文件中的所有条目都是数字,它们似乎都能正常工作

我要找的是

  • 将数据导入普通二维数组的方法
  • 解释为什么loadtxt导入数组数组

示例CSV文件:

2011,12,25,AAA,AAA,AAA
2011,12,26,BBB,BBB,BBB
2011,12,27,CCC,CCC,CCC

1 个答案:

答案 0 :(得分:3)

np.loadtxt返回一维数组是对的,但您仍然可以访问structured array中实际为字段的“列”:

array([(2011, 12, 25, b'AAA', b'AAA', b'AAA'),
       (2011, 12, 26, b'BBB', b'BBB', b'BBB'),
       (2011, 12, 27, b'CCC', b'CCC', b'CCC')], 
      dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', 'S4'), ('f4', 'S4'), ('f5', 'S4')])

它允许您为字段编制索引,但您需要通过名称(f0f1f2 ...)进行索引。不是索引:

nt['f3']
#>>> array([b'AAA', b'BBB', b'CCC'], 
#>>>       dtype='|S4')

您当然可以指定dtype名称:

dtype=[('MEAT', '<i4'), ('CHEESE', '<i4'), ('TOAST', '<i4'), ('BIRD', 'S4'), ('PLANE', 'S4'), ('SOCK', 'S4')]
nt = numpy.loadtxt('/home/joshua/file.csv', dtype=dtype, delimiter=',')

nt['SOCK']
#>>> array([b'AAA', b'BBB', b'CCC'], 
#>>>       dtype='|S4')

这样做是为了简化非均匀阵列引起的许多并发症。