【问题标题】:Using : operator to index numpy.ndarray of numpy.void (as output by numy.genfromtxt)使用 : 运算符来索引 numpy.void 的 numpy.ndarray(作为 numy.genfromtxt 的输出)
【发布时间】:2012-09-07 15:23:38
【问题描述】:

我像这样使用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 行方法?

【问题讨论】:

    标签: numpy indexing python-2.7 genfromtxt


    【解决方案1】:

    作为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
    

    【讨论】:

    • 我采纳了你的最后一个建议并像这样修改了它 --- 用于数据中的 B0、B1、B2、ATMAdjustment[["B0","B1","B2","ATMAdjustmen"]] : --- 这是一种可以接受的方式吗?
    • 当我尝试对 pytables Table.readWhere() 函数返回的列进行切片时,这个答案对我很有用。没意识到什么是结构化数组(readWhere()返回的对象类型是,没意识到和“结构化数组”一样)
    猜你喜欢
    • 2018-03-29
    • 2017-10-20
    • 1970-01-01
    • 2017-03-24
    • 2020-05-13
    • 1970-01-01
    • 1970-01-01
    • 2019-09-07
    • 1970-01-01
    相关资源
    最近更新 更多