使用:运算符索引numpy.void的numpy.ndarray(作为numy.genfromtxt的输出)

使用:运算符索引numpy.void的numpy.ndarray(作为numy.genfromtxt的输出),numpy,indexing,python-2.7,genfromtxt,Numpy,Indexing,Python 2.7,Genfromtxt,我使用numpy.genfromtxt生成数据,如下所示: ConvertToDate = lambda s:datetime.strptime(s,"%d/%m/%Y") data= numpy.genfromtxt(open("PSECSkew.csv", "rb"), delimiter=',', dtype=[('CalibrationDate', datetime),('Expiry',

我使用
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:]

但这给了我一个“无效索引”错误。有什么方法可以很好地做到这一点,或者我应该坚持使用四行方法吗?

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

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

我接受了您最后的建议,并对其进行了如下修改——对于数据中的B0、B1、B2、ATMAdjustment[[“B0”、“B1”、“B2”、“ATMAdjustmen”]]:——这是一种可以接受的方式吗?当我尝试对pytables Table.readWhere()函数返回的列进行切片时,这个答案对我很有用。我没有意识到结构化数组是什么(readWhere()返回的对象的类型是什么,我没有意识到它与“结构化数组”相同),我接受了你的最后一个建议,对它进行了如下修改——对于数据中的B0、B1、B2、ATMAdjustment[[“B0”、“B1”、“B2”、“ATMAdjustmen”]]:---这是一种可以接受的方式吗?当我尝试对pytables.readWhere()函数返回的列进行切片时,这个答案对我很有用。我没有意识到结构化数组是什么(readWhere()返回的对象类型是什么,我没有意识到它与“结构化数组”相同)