-3

そのため、ディレクトリ内のファイルをループし、指定された配列を各ファイルから取り出し、それらを 1 つの大きな配列に並べてスタックする関数があります。

def Graph(files,directory):
    pattern = "{}.fits".format(files)
    x = array([])
    for filename in fnmatch.filter(os.listdir(directory),pattern):
        data = pyfits.getdata(filename)
        x1 = data.field('table')
        x = hstack((x,x1))

    plot(x,y) #where y would also be defined as data retrieved in the loop

関数がループを終了すると、大きな配列 (x) が完全にクリアされます。なぜこれが起こっているのか手がかりはありますか?

ファイルのリストからデータを取得し、すべてのデータを 1 つの配列に結合して、そのデータをプロットする必要があります。(同じ方法で作成される別の配列「y」に対してそれをプロットします。)

4

2 に答える 2

2

確かにx、関数で作成しました。関数が終了すると、関数はスコープ外になり、自動的にクリーンアップされます。

関数の最後でそれを返し、結果を保存します。

def Graph(files,directory):
    pattern = "{}.fits".format(files)
    x = array([])
    for filename in fnmatch.filter(os.listdir(directory),pattern):
        data = pyfits.getdata(filename)
        x1 = data.field('table')
        x = hstack((x,x1))

    plot(x,y) #where y would also be defined as data retrieved in the loop

    return x

x = Graph(files, directory)
于 2013-02-03T23:25:26.227 に答える
0

また、他の人がすでに指摘しているようにreturn、後で使用するには、読み込んだ配列が必要です。いくつかの追加コメント:

  • ルーチンがデータを読み取るだけで、ルーチンがデータを返した後にそれをプロットすると、より洗練されたものになります。

  • コピーを作成するため、ループ内で hstack を使用しないでください。fromfilenumpy のまたはルーチンを使用するgenfromtxtか、少なくともループ内にリストを作成し、ループが終了したらこれを配列に変換します。同様の方法で取得した場合、同じことが y にも当てはまります。

    def readfiles(files, directory):
        "Returns x and y values read from files in a given directory."
        pattern = "{}.fits".format(files)
        tmpx = []
        tmpy = []
        for filename in fnmatch.filter(os.listdir(directory),pattern):
            data = pyfits.getdata(filename)
            tmpx.append(data.field('table'))
            tmpy.append(...)    # Retrieve your y data
        x = hstack(tmpx)
        y = hstack(tmpy)
        return x, y
    
    # Main program
    x, y = readfiles("test", "testdir")
    plot(x, y)
    
于 2013-02-04T07:16:56.093 に答える