2

我有一个 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 操作应该返回一个具有 shape 的数组100x6。但是,这会返回一个 的数组100x1,每个元素都是一个 的数组1x6

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

我正在寻找的是

  • 一种将我的数据导入普通二维数组的方法
  • 关于为什么 loadtxt 导入数组数组的一些解释

示例 CSV 文件:

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

1 回答 1

3

你是对的,它np.loadtxt返回一个一维数组,但你仍然可以访问“列”,它们实际上是结构化数组中的字段

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

它确实允许您索引字段,但您需要通过名称(、、...)而不是索引来f0这样f1f2

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

这样做是为了简化由非同质阵列引起的许多复杂情况。

于 2013-09-29T15:31:31.687 回答