2

このような最初の3つの列を持つ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引数を使用する必要があるようです。その結果、入力は 2D 配列ではなく、配列の 1D 配列になります。これらのサイトにある例をいくつか試してみましたが、CSV ファイルのすべてのエントリが数字である限り、問題なく動作するようです。

私が探しているのはどちらかです

  • データを通常の 2 次元配列にインポートする方法
  • loadtxt が配列の配列をインポートする理由の説明

CSV ファイルの例:

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

1 に答える 1

3

1D配列を返すのは正しいです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')])

フィールドにインデックスを付けることができますが、インデックスではなく名前 ( 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')

これは、不均一な配列から生じる多くの複雑さを単純化するために行われます。

于 2013-09-29T15:31:31.687 に答える