2016-07-21 12 views
2

私がやっていることは、Pythonの断片的な関数に基づいてテーブルを作ることです。例えば、私はこのコードを書いたと言う:スカラーをヌンプイ配列と比較する

import numpy as np 
from astropy.table import Table, Column 
from astropy.io import ascii 
x = np.array([1, 2, 3, 4, 5]) 
y = x * 2 
data = Table([x, y], names = ['x', 'y']) 
ascii.write(data, "xytable.dat") 
xytable = ascii.read("xytable.dat") 
print xytable 

これは予想通り、それはx値1〜5及びy値は2、4、6、8、10

を有するテーブルを印刷動作しかしが3以下の場合にのみyx * 2とし、それ以外の場合はyx + 2とする場合はどうすればよいですか?

私が追加した場合:

if x > 3: 
    y = x + 2 

それは言う:複数の要素を持つ配列の

真理値があいまいです。 a.any()またはa.all()を使用する

どのようにしてパーツ単位で機能するようにテーブルをコーディングするのですか?スカラーとナンパー配列を比較するにはどうすればいいですか?

+1

この質問は、AstropyまたはTableクラスとは関係ありません。それは、あなたがあなたのデータをどのように読んでいるかだけです。あなたは "numpy"という質問にタグをつけ、例のためにnumpyの配列x、yを直接使うべきです。必要な作業を行うには、[numpy.where](http://docs.scipy.org/doc/numpy/reference/generated/numpy.where.html)または[numpy.choose](http:// docs。 scipy.org/doc/numpy/reference/generated/numpy.choose.html)。 – Christoph

+0

@Christoph:良い点;更新されたタグ。 – bernie

答えて

3

あなたはおそらくnumpy.where()を使用することができます。

In [196]: y = np.where(x > 3, x + 2, y) 

In [197]: y 
Out[197]: array([2, 4, 6, 6, 7]) 

コードは、上記の取得仕事は完全にベクトル化された方法。このアプローチは、リスト内包表記と型変換を使用するよりも、一般的に効率的(そしておそらくエレガント)です。

+0

正しい配列を出力しますが、テーブルを作成する必要があるy値は永久に変更されません。しかし、一束もありがとう! –

+0

出力を 'y'に代入するだけです。私の答えを編集して、 'y'が実際にどのように変更されるのかを示します。 – Tonechas

+0

大丈夫です。私はそれを見落とした。もう一度おねがいします! –

1

numpyを使用しないで始めてください(あるいはnumpyを知らないかもしれません)。通常のpythonリストを使用してください。

x = [ 1, 2, 3, 4, 5 ] 
y = [ i * 2 if i < 3 else i + 2 for i in x ] 
print y 

出力:

[2, 4, 5, 6, 7] 

次に、あなたがそれnumpyの配列にすることができます。

x = np.array(x) 
y = np.array(y)