2012-01-17 15 views
2

numpy配列の整数とキーワードの両方のインデックスを処理するクラスを作成する簡単な方法があるのだろうかと思っていました。python numpy array/dict multiple inheritance

最後の目標は、各変数の名前を使用してインデックスを作成できるnumpy配列を持つことです。 I、リスト

import numpy as np 
a = [0,1,2,3,4] 
names = ['name0','name1','name2','name3','name4'] 
A = np.array(a) 

を持っている場合たとえば、私は(例えば)A [「NAME1」]の呼び出しで簡単の値を取得できるようにし、まだアレイは全て保持しなければなりませんnumpy配列の機能性

ありがとうございます!

ピーター

編集:助けを

本当にありがとうございました、私は、使用目的により明確にしようとするでしょう!私は、変数のベクトルを格納して適用するためにnumpy配列を使用する既存のコードセットを持っています。私のベクトルは約30のエントリを持っています。

特定の変数の値を確認したいとき、またはその変数を変更したいときは、どの変数がどの変数に対応しているかを覚えておく必要があります配列が作成されたら変更してください)。今私は辞書を使って追跡しています。たとえば、30個の値を持つ配列が 'VarVector'です。 「vmax」はエントリ15であり、値は0.432である。 VarDict [entry] = indexのように、30個のキー「VarDict」を持つ並行辞書を作成します。私は呼び出し

VarVector [VarDict [「VMAX」]]単にの良い方法があるだろう場合、私は思っていた0.432

を返します

を連鎖によって、VMAXの値を見つけることができますこの方法VarVector [15](互換性用)とVarVector ["vmax"](私にとっては便宜上)の両方が同じ番号を指し示すように、これらの2つの構造を組み合わせます。

ありがとうございます! Peter

+2

numpy配列のポイントは、それらがCで書かれているため、高速です。これを行うと、配列数が減るという利点が失われます - あなたはPythonリストを使うこともできます! – katrielalex

+0

あなたはこれをしたい理由を与えることができますか? – katrielalex

+1

@katrielalex - 必ずしもそうではありません... numpy配列の '__getitem__'はすでにかなり遅いです。これにこれを追加することで、大幅に遅くするつもりはありません。しかし、これはかなり一般的なユースケースであり、すでに数回( 'pandas'と' larry')行われています。この比較を見てみましょう:http://scipy.org/StatisticalDataStructures「ラベル付き軸」または「ラベル付きアイテム」を持つことは、場合によっては良いことです。 –

答えて

1

あなたの説明から、structured array(numpyに組み込まれています)がほしいと思うようです。例えば。

# Let's suppose we have 30 observations with 5 variables each... 
# The five variables are temp, pressure, x-velocity, y-velocity, and z-velocity 
x = np.random.random((30, 5)) 

# Make a structured dtype to represent our variables... 
dtype=dict(names=['temp', 'pressure', 'x_vel', 'y_vel', 'z_vel'], 
      formats=5 * [np.float]) 

# Now view "x" as a structured array with the dtype we created... 
data = x.view(dtype) 

# Each measurement will now have the name fields we created... 
print data[0] 
print data[0]['temp'] 

# If we want, say, all the "temp" measurements: 
print data['temp'] 

# Or all of the "temp" and "x_vel" measurements: 
print data[['temp', 'x_vel']] 

rec arraysもご覧ください。これらは少し柔軟性がありますが、かなり遅くなります。

data = np.rec.fromarrays(*x, 
       names=['temp', 'pressure', 'x_vel', 'y_vel', 'z_vel']) 
print data.temp 

しかし、すぐにこれらの方法のいずれかの制限が適用されます(つまり、両方の軸に名前を付けることができます)。その場合は、項目にラベルを付けるだけの場合はlarryを、見つからない値の処理についてはラベルを付ける場合はpandasを参照してください。

0

これはテストしていませんが、動作するはずです。

考えられるのは、入力がintでnumpy配列に使用すると仮定し、そうでない場合はdictに使用します。

import numbers 
import numpy 

class ThingArray: 
    def __init__(self): 
     self.numpy_array = numpy.array() 
     self.other_array = dict() 

    def __setitem__(self, key, value): 
     if isinstance(key, numbers.Integral): 
      self.numpy_array[key] = value 
     else: 
      self.other_array[key] = value 

    def __getitem__(self, key): 
     if isinstance(key, numbers.Integral): 
      return self.numpy_array[key] 
     else: 
      return self.other_array[key] 


thing = ThingArray() 

thing[1] = 100 
thing["one"] = "hundred"   

print thing[1] 
print thing["one"] 
0

あなたがndarrayをサブクラス化し、関連するメソッドをオーバーライドすることができます(つまり__getitem____setitem__、...)。 More info here。これは@ Joeの答えと似ていますが、ndarrayのほとんどすべての機能を保持しているという利点があります。あなたは明らかもう次の操作を行うことができなくなります。

In [25]: array = np.empty(3, dtype=[('char', '|S1'), ('int', np.int)]) 

In [26]: array['int'] = [0, 1, 2] 

In [27]: array['char'] = ['a', 'b', 'c'] 

In [28]: array 
Out[28]: 
array([('a', 0), ('b', 1), ('c', 2)], 
     dtype=[('char', '|S1'), ('int', '<i8')]) 

In [29]: array['char'] 
Out[29]: 
array(['a', 'b', 'c'], 
     dtype='|S1') 

In [30]: array['int'] 
Out[30]: array([0, 1, 2]) 

あなたがこれをやってみたかった、なぜ私たちは知っていたならば、我々はより詳細な答えを与えることができるかもしれません。