0

numpy.genfromtxt次のように使用してデータを生成します。

ConvertToDate = lambda s:datetime.strptime(s,"%d/%m/%Y")
data= numpy.genfromtxt(open("PSECSkew.csv", "rb"), 
                        delimiter=',',
                        dtype=[('CalibrationDate', datetime),('Expiry', datetime), ('B0', float), ('B1', float), ('B2', float), ('ATMAdjustment', float)],
                        converters={0: ConvertToDate, 1: ConvertToDate})

変数を分離するために、最後の 4 列 (各行ではあるがループ内にあるため、1 つの行だけを考えてみましょう) を抽出したいと考えています。だから私はこれを行います:

    B0 = data[0][2]
    B1 = data[0][3]
    B2 = data[0][4]
    ATM = data[0][5]

しかし、私がこれを行うことができれば(たとえば、通常の2D ndarrayでできるように)、私はそれを好むでしょう:

    B0, B1, B2, ATM = data[0][2:]

しかし、これにより「無効なインデックス」エラーが発生します。これをうまく行う方法はありますか、それとも 4 行のアプローチに固執する必要がありますか?

4

1 に答える 1

5

の出力としてnp.genfromtxt、構造化配列、つまり、各行が異なるフィールドである1D配列があります。

一部のフィールドにアクセスする場合は、名前でアクセスしてください。

data["B0"], data["B1"], ...

それらをグループ化することもできます。

data[["B0", "B1]]

これにより、必要なフィールドのみを含む「新しい」構造化配列が得られます(データはコピーされないため、「新しい」を引用符で囲みます。初期配列と同じです)。

特定の「行」が必要な場合は、次のようにしてください。

data[["B0","B1"]][0]

最初の行を出力します。スライスと派手なインデックス作成も機能します。

だから、あなたの例のために:

B0, B1, B2, ATM = data[["B0","B1","B2","ATMAdjustment"]][0]

これらのフィールドのみに行ごとにアクセスする場合は、最初に必要なフィールドの配列全体を格納してから、次のように繰り返すことをお勧めします。

filtered_data = data[["B0","B1","B2","ATMAdjustment"]]
for row in filtered_data:
    (B0, B1, B2, ATM) = row
    do_something

あるいは :

for (B0, B1, B2, ATM) in filtered_data:
    do_something
于 2012-09-14T12:55:39.553 に答える