1

我正在将 Matlab 脚本移植到 Python。以下是摘录:

%// Create a list of unique trade dates
DateList = unique(AllData(:,1));

%// Loop through the dates
for DateIndex = 1:size(DateList,1)

    CalibrationDate = DateList(DateIndex);
    %// Extract the data for a single cablibration date (but all expiries)
    SubsetIndices = ismember(AllData(:,1) , DateList(DateIndex)) == 1;    
    SubsetAllExpiries = AllData(SubsetIndices, :);

AllData是一个N × 6单元矩阵,前 2 列是日期(字符串),其他 4 列是数字。在 python 中,我将从 csv 中获取这些数据,如下所示:

import numpy as np
AllData = np.recfromcsv(open("MyCSV.csv", "rb"))

因此,如果我没记错的话,现在AllData是一个普通元组的 numpy 数组。这是保存这些数据的最佳格式吗?目标是从第 1 列中提取唯一日期列表,并为每个日期提取第 1 列中具有该日期的行(第 1 列已排序)。然后对于第一列中的每一行,对剩余 5 列中的数字和日期进行一些数学运算。

所以在matlab中我可以得到日期列表,unique(AllData(:,1))然后我可以得到对应于该日期的记录(行)(即第一列中的日期),如下所示:

SubsetIndices = ismember(AllData(:,1) , MyDate) == 1;    
SubsetAllExpiries = AllData(SubsetIndices, :);

如何在 Python 中最好地实现相同的结果?

4

1 回答 1

3

把事情放在上下文中,np.recfromcsv只是np.genfromtxt输出记录数组而不是结构化数组的修改版本。

结构化数组允许您通过名称访问各个字段(此处为您的列),例如 in ,my_array["field_one"]而记录数组为您提供相同的功能,并且可以将字段作为属性访问,例如 in my_array.field_one。我不喜欢“作为属性访问”,所以我通常坚持使用结构化数组。

供您参考,structurede/record 数组不是元组数组,而是一些 numpy 对象的数组调用 a np.void:它是一个内存块,由您拥有的字段子块组成,每个子块的大小取决于其数据类型。

也就是说,是的,您似乎想到的正是结构化数组的那种用法。该方法将是:

  • 获取您的dates数组并过滤它们以找到独特的元素。
  • 找到这些唯一元素的索引,作为一个整数数组,我们称之为 matching
  • 用于使用花哨的索引matching访问相应的记录(例如,数组的行),如 .my_array[matching]
  • 根据需要对记录执行计算。

请注意,您可以将日期保留为字符串或datetime使用用户定义的转换器将它们转换为对象,如文档中所述。例如,您可以将 aYYYY-MM-DD转换为datetime带有 a 的对象lambda s:datetime.dateime.strptime(s,"%Y-%m-%d")。这样,比方说,N每行(一条记录)由两个日期作为字符串和 4 个浮点数组成的数组,你将有一个N数组,其中每行由两个datetime对象和 4 个浮点数组成。

注意你的数组的形状(通过my_array.shape),它说(N,),这意味着它是一个一维数组,即使它看起来像一个具有多列的二维表。您可以使用其名称访问各个字段(每个“列”)。例如,如果我们创建一个由一个名为的字符串字段first和一个int名为的字段组成的数组second,如下所示:

x = np.array([('a',1),('b',2)], dtype=[('first',"|S10"),('second',int)])

您可以访问该first

>>> x['first']
array(['a', 'b'], 
      dtype='|S10')
于 2012-09-12T16:03:27.660 回答