2012-03-20 21 views
6

colorという属性を持つStarというクラスがあります。私はstar.colorで色を得ることができます。NumPyのオブジェクトの配列から属性を取得する

しかし、これらのStarオブジェクトのNumPy配列がある場合はどうなりますか?色の配列を取得するための好ましい方法は何ですか?

私は

colors = np.array([s.color for s in stars]) 

でそれを行うことができます。しかし、これはそれを行うための最善の方法は何ですか? colors = star.colorまたはcolors = star->colorなどを他の言語のように使うことができれば素晴らしいと思います。 numpyでこれを行う簡単な方法はありますか?

+0

[numpyオブジェクトの配列]の可能な複製(http://stackoverflow.com/questions/4877624/numpy-array-of-objects) – YXD

答えて

7

あなたが望むものに近いものではなく、Pythonオブジェクトのndarrayrecarrayを使用することです:

num_stars = 10 
dtype = numpy.dtype([('x', float), ('y', float), ('colour', float)]) 
a = numpy.recarray(num_stars, dtype=dtype) 
a.colour = numpy.arange(num_stars) 
print a.colour 

プリントPythonオブジェクトのnumpyの配列を使用して

[ 0. 1. 2. 3. 4. 5. 6. 7. 8. 9.] 

通常あまり効率的ですプレーンであるlistを使用するよりも、recarrayはより効率的なフォーマットでデータを格納します。

+0

クール。だから私の望むものである構造のIDL配列に似ています。正規のPythonクラスが既に定義されている場合、これをどのように使用しますか?それを行う簡単な方法はありますか? – Dave31415

+0

@ Dave31415:IDL?だから、あなたは天文学者ですか、それとも誰か*外天体ですか?あなたの質問については、クラス定義を見ることなく、これは答えにくいです。 NumPyを使用すると、一般に、単一のレコードで動作する「メソッド」が必要となるのではなく、アレイ全体を一度に操作できる機能が必要になります。だから、あなたの方法をベクトル化する必要があります。 –

+0

元の天文学者にしようとしています。だから私はあなたが言っていることは、オブジェクトの配列がnumpyの優先データ構造ではないということだと思います。しかし、それは何ですか?私は属性がnumpy配列であるクラスを作ることができます。それは良い方法ですか?それは私が望むようには聞こえません。 – Dave31415

3

numpy.fromiter(s.color for s in stars)(角括弧が欠けています)を使用できます。そうすれば、中間リストを作成することは避けられます。これはnumpyを使用している場合に気になると思います。

(下記の@SvenMarnachと@DSMに感謝します)。

+2

残念ながらそれはうまくいかないでしょう:あなたは 'array(<生成オブジェクト at 0x9cff34c>、dtype =オブジェクト)'のようなものを得ます。 (これはかつて私のコードにバグがありましたが、これは最終的にはこれがうまくいくと思ったからです) – DSM

+1

これには 'numpy.fromiter()'を使う必要があります。 –

+2

注:最近numpysで動作するようにするには、 'numpy.fromiter((sで星はs)、float)'が必要です。また、 'count = len(stars)'を追加すると、長い配列のほうが効率的になります。 – Dougal

関連する問題