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 列(每行但在一个循环中,所以我们只考虑一行)来分隔变量。所以我这样做:

    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,您有一个结构化数组,即一维数组,其中每一行作为不同的字段。

如果要访问某些字段,只需按名称访问它们:

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 回答