3

以下に示すように、テキスト ファイルを 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')])

列をスライスしようとすると、つまり、次を使用して最初または2番目の列を抽出します

data[:,0]

「インデックスが多すぎます」と表示されます。保管方法に原因があることがわかりました。すべての行は、リスト/配列ではなくタプルとして格納されています。反復を使用せずにスライスを実行できる「最も醜い」方法を使用することを考えました。それは、各行のタプルをリストに変換し、numpy 配列に戻すことです。このようなもの

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

しかし、上記の問題のために、各列のデータ型が失われています。各要素は、前者の場合に自動的に検出された整数または浮動小数ではなく、文字列として格納されます。

繰り返しを使用せずに列をスライスしたい場合、方法はありますか?

4

2 に答える 2

5

作成されたのは、 dtypenp.genfromtextを持つタプルの配列ではなくobject、レコード配列です。奇妙な dtype からわかります。

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

そのリスト内の各タプルは、対応するフィールドの名前を保持し、その dtype<i4はリトルエンディアンの 4 バイト整数、<f8リトルエンディアンの 8 バイト浮動小数点数、およびS1919 文字の長さの文字列です。次のように名前でフィールドにアクセスできます。

In [2]: x['f0']
Out[2]: array([ 534,  650,  675,  715, 2884, 3799, 4549, 4819])

In [3]: x['f1']
Out[3]: 
array([ 116.48482,  116.4978 ,  116.31873,  116.70027,  116.67727,
        116.29838,  116.48405,  116.42967])
于 2013-04-21T21:14:06.183 に答える
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)
于 2013-04-21T18:55:13.880 に答える