我正在将一个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 -by- 6 单元格矩阵,前2列是日期(字符串),其他4列是数字。在python中,我将从csv中获取这些数据,如下所示:
import numpy as np
AllData = np.recfromcsv(open("MyCSV.csv", "rb"))
所以现在如果我没有弄错AllData
是一群普通的元组。这是获取此数据的最佳格式吗?目标是从第1列中提取唯一日期列表,并在每个日期中提取第1列中具有该日期的行(第1列是有序的)。然后,对于第一列中的每一行,对剩余的5列中的数字和日期进行一些数学计算。
所以在matlab中我可以通过unique(AllData(:,1))
获取日期列表,然后我可以得到与该日期相对应的记录(行)(即第一列中的那个日期),如下所示:
SubsetIndices = ismember(AllData(:,1) , MyDate) == 1;
SubsetAllExpiries = AllData(SubsetIndices, :);
如何在Python中获得最佳效果?
答案 0 :(得分:3)
为了把事情放在上下文中,np.recfromcsv
只是np.genfromtxt
的修改版本,它输出记录数组而不是结构化数组。
structured array可让您按名称访问各个字段(此处为您的列),例如在my_array["field_one"]
中,而记录数组为您提供相同的 plus 以my_array.field_one
之类的方式访问字段作为属性。我不喜欢“作为属性访问”,所以我通常坚持使用结构化数组。
为了您的信息,structurede / record数组是不元组的数组,但是一些numpy对象的数组调用np.void
:它是由尽可能多的子块组成的内存块你有字段,每个子块的大小取决于它的数据类型。
那就是说,是的,你似乎想到的只是结构化数组的用法。那么方法是:
dates
数组并过滤它们以查找唯一元素。matching
; matching
使用fancy indexing访问相应的记录(例如,您的数组的行),
my_array[matching]
。请注意,您可以将日期保留为字符串,或使用用户定义的转换器将其转换为datetime
个对象,如documentation中所述。例如,您可以使用YYYY-MM-DD
将datetime
转换为lambda s:datetime.dateime.strptime(s,"%Y-%m-%d")
个对象。这样,而不是拥有一个N
数组,其中每一行(一个记录)由两个日期组成字符串和4个浮点数,你将有一个N
数组,其中每一行包含两个{ {1}}对象和4个浮点数。
注意数组的形状(通过datetime
),它表示my_array.shape
,这意味着它是一维数组,即使它看起来像一个包含多列的2D表。您可以使用其名称访问各个字段(每个“列”)。例如,如果我们创建一个数组,其中包含一个名为(N,)
的字符串字段和一个名为first
的{{1}}字段,就像这样:
int
您可以使用
访问second
列
x = np.array([('a',1),('b',2)], dtype=[('first',"|S10"),('second',int)])