4

私は自分で解決策を見つけるために最善を尽くしましたが、関連するものを見つけていません。.tbl ファイルから抽出されたいくつかの numpy 配列があります (これは、atpy で抽出している天文テーブル形式です)。各配列には約 25,000 個の数値があり、matplotlib を使用してそれらを散布図としてプロットしています。y 軸の値は配列からそのまま取得され、x 軸は 2 つの個別の配列の値の単純な減算です。

これで問題ありませんが、実際に行う必要があるのは、特定の範囲に収まる値を抽出することです (たとえば、y の値が 10 から 13 の間で、x の値が 0 から 1 の間である必要があります)。もちろん、プロットが機能するためには、これらの値がすべて互いに一致する必要があります。これが私が持っているものです:

import numpy as np
from numpy import ndarray
import matplotlib.pyplot as plt
import matplotlib
import atpy

twomass = atpy.Table()

twomass.read('/Raw_Data/IRSA_downloads/2MASS_GCbox1.tbl')

hmag = list([twomass['h_m']])

jmag = list([twomass['j_m']])

colorjh = list([j-h for j,h in zip(jmag, hmag)])

x = []

y = []

def list_maker():
for c,h in zip(colorjh, hmag):
    if np.all(c) < 1 == True and np.all(c) > 0 == True and np.all(h) < 13 == True and np.all(h) > 10 == True:
        x.append(c)
        y.append(h)       

list_maker()

plt.scatter(x, y, c='g', s=1, alpha=0.05)

plt.xlabel('Color(J-H)', fontsize=15)           #adjust axis labels here
plt.ylabel('Magnitude (H)', fontsize=15)

plt.gca().invert_yaxis()

plt.legend(loc=2)
plt.title('CMD for Galactic Center (2MASS)', fontsize=20)
plt.grid(True)

plt.show()

データをスライスするためにこの方法も試しましたが、うまくいきませんでした:

colorjh = colorjh[colorjh<1]

colorjh = colorjh[colorjh>0]

これらの配列をリストに変換しようとしたり、不等式の書式設定でさまざまなことを試したりするなど、さまざまなことを試しました。その過程で、私は答えから遠ざかったかもしれませんが、このコードは少なくとも散布図全体を出力します (希望どおりにデータを切り分けることができません)。他のいくつかの反復では、私が探している数値範囲のどこにもない空白のプロットが印刷されました。

私はPythonとこのサイトを初めて使用するので、ヒントなどをできるだけ明確にしてください。非常に専門用語が多い場合は、あなたの提案をうまく活用できない可能性があります。みんな、ありがとう。

4

2 に答える 2

7

for次のことを試してください。これはあなたのsやsと同じように機能すると思いますが、zipはるかに高速であるはずです。何か意味がない場合は、コメントで質問してください。編集します。

hmag = np.array(hmag)
jmag = np.array(jmah)

colorjh = jmag - hmag
idx_c = (colorjh > 0) & (colorjh < 1) # where condition on c is met
idx_h = (hmag > 10) & (hmag < 13) # where condition on h is met
idx = idx_c & idx_h # where both conditions are met

plt.scatter(colorjh[idx], hmag[idx], c='g', s=1, alpha=0.05)
于 2013-03-20T16:13:22.630 に答える
2

両方の条件を一度に実行できます。

hmag = np.array(hmag)
jmag = np.array(jmah)
colorjh = jmag - hmag

idx = ((colorjh > 0) & (colorjh < 1) & (hmag > 10) & (hmag < 13)).nonzero()[0]

plt.scatter(colorjh[idx], hmag[idx], c='g', s=1, alpha=0.05)

これ.nonzero()[0]により、True 値と False 値を持つ「マスク」ではなく、インデックスのリストになります。非常に長いリストについて話している場合、これはより効率的です。

于 2013-03-21T15:12:34.990 に答える