2011-08-12 7 views
9

簡単な質問についてnumpyのは:numpyの、名前の列

私はベクトルaに100個の値をロードします。このベクトルから、2つの列を持つAという配列を作成します.1つの列の名前は「C1」で、2つ目の列は「C2」、1つはint32、もう1つはint64です。例:私はaから配列を作成する場合、カラムの種類と名前を定義する方法

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
# A.dtype = ...? 

+0

あなたの最善の策は、配列(実際は2)と名前のリストをコンテナクラスにラップして使用することです。 – Keith

+0

@Keith:あなたは特定のクラスを意味しますか(私はnumpyで新しいです)? –

+0

いいえ、私はあなたが作成することを意味します。次に、新しいクラスで定義したメソッドから配列に操作を委譲します。 '__str__'メソッドを定義して、ヘッダで配列をきれいに印刷することもできます。 – Keith

答えて

9

numpyの構造化された配列が命名した列:

import numpy as np 

a=range(100) 
A = np.array(zip(*[iter(a)]*2),dtype=[('C1','int32'),('C2','int64')]) 
print(A.dtype) 
# [('C1', '<i4'), ('C2', '<i8')] 

あなたはこのように列を名前でアクセスすることができます。

print(A['C1']) 
# [ 0 2 4 6 8 10 12 14 16 18 20 22 24 26 28 30 32 34 36 38 40 42 44 46 48 
# 50 52 54 56 58 60 62 64 66 68 70 72 74 76 78 80 82 84 86 88 90 92 94 96 98] 

注意をzipnp.arrayを使用すると、一時から、アレイを構築するためにnumpyのを引き起こすことタプルのリスト。 Pythonのタプルリストは、同等のNumPy配列よりもはるかに多くのメモリを使います。だからあなたの配列が非常に大きい場合は、zipを使いたくないかもしれません。

代わりに、numpyの配列A与え、あなたはA 1D 配列を作るためにravel()を使用して、構造化された配列にそれを回すし、目的のタイプに列を変換する astypeを使用するようにviewを使用することができます。

a = range(100) 
A = array(a).reshape(len(a)/2, 2) 
A = A.ravel().view([('col1','i8'),('col2','i8'),]).astype([('col1','i4'),('col2','i8'),]) 
print(A[:5]) 
# array([(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)], 
#  dtype=[('col1', '<i4'), ('col2', '<i8')]) 

print(A.dtype) 
# dtype([('col1', '<i4'), ('col2', '<i8')]) 
+0

あなたは正しいです。 http://docs.scipy.org/doc/numpy-1.4.x/reference/arrays.dtypes.html –

7

私は、これは古い質問ですけど、最近で利用できるオプションは、pandasを使用しようとするだろう。 DataFrameタイプは、このような構造化データ用に設計されています。ここでは、列の名前が付けられ、さまざまなタイプのものがあります。

関連する問題