【发布时间】:2018-11-12 02:55:01
【问题描述】:
这可能是一个软问题,但它就是这样。我有一个具有特定结构的大型数据集,我想转移到 Python 以开始使用 sklearn 包(以前我使用的是 MATLAB)。我不是 Python 专家,在大多数情况下,您可以将我视为初学者。背景如下:
数据结构如下。原始数据是一个 33 x 300 的矩阵(比如我有大约 500 个这样的样本),它们是时间序列的。每一行都来自一个 generating 变量,这些变量的收集时间超过 300 秒。这些数据点标有标签(对应于它们的类/类型,这实际上是一个多标签问题),名称对应于从谁收集样本,但也有属性取决于 when 数据积分被收集。按顺序收集的积分标记为run1、run2(如果是单次收集的);称为session。相隔一天或多天采集的样本属于不同的会话;我有多个会话。
我在 MATLAB 中分析数据的方式是创建一个我自己的类,其中包含一个 structs 数组,然后我定义了方法和函数,以便我可以添加或删除特定样本,添加或删除 @987654327 @ 从数据集中添加或删除sessions,从整个数据集的时间序列中添加或删除行,分别考虑样本类别等。MATLAB 类的每个实例都保存了协方差矩阵以进行 PCA 降维; that 实例的struct 的其他生成的特征,如相关矩阵等。在 MATLAB 中总共大约有 2k 行。主要目的只是将数据加载一次到MATLAB,实际上是加载到类的实例中,然后将指令列表/对类方法的调用链接在一起,这样我就可以将数据集修剪和编辑为我想了。
现在开始提问:
-
在处理这种情况时,最pythonic的是什么?我从
list的dicts方法开始,代码的某些部分感觉非常不符合pythonic。这是一个从 a 研究或类实例中删除样本的示例,def mod_samples(self, op, idxs): if not type(idxs) == list: print('Error: mod_samples must be called with a list of sample names!') if op == 'rem': for idx in idxs: for sample in self.samples: if sample['Name'] == idx: self.removed_samples.append(sample) self.samples.remove(sample) if op == 'add': for idx in idxs: for sample in self.removed_samples: if sample['Name'] == idx: self.samples.append(sample) self.removed_samples.remove(sample) self.recompute()
肯定有比使用字符串比较的双循环更优雅的方法吗? recompute 这里只是对“新”数据集再次进行降维等。同样强制 idxs 是一个列表对我来说似乎很奇怪。但另一方面,for item in itemList 不区分字符串或列表。 :/
有更好的方法吗?实用程序包中的其他一些数据类型或其他什么?因为
name是一个键,而我是根据值而不是键来删除样本,所以dicts的效率似乎对我不利。-
我的 MATLAB 实现很差,因为实现深拷贝非常费力;我通过使用第二个构造函数从 reduced
struct而不是磁盘/数据文件创建类的新实例来回避这个问题。例如,假设集合中的样本标记为来自run1,则调用dataSet.removeRun('run1')会产生一个结构对象,然后我可以将其用作,
modifiedDataSet = clusterClass('isPoor', true, 'poorStruct', dataSet.removeRun('run1'))这里的问题是 Python 的深拷贝能力是什么?我对 Python 中的 OOP 非常陌生。我是否必须逐位覆盖默认的复制构造函数,变量的变量,属性的属性?有时 有必要有两个不同的(内部)实例,因为这是为了比较。
最后,速度方面的考虑:我的数据集并不庞大。我估计我有时保存到磁盘的 .MAT 文件在一天结束时通常约为 12-15 Mb。但是 MATLAB 已经对其内部进行了数十年的磨练,而
NumPy/SciPy我认为是比较新的(是的,MATLAB 中的 OOP 可以被认为是更新的,但我并没有觉得它太糟糕)。我的大部分数据不是稀疏的。他们对这方面的表现有什么建议吗?我主要做的是大型矩阵乘法、数值积分、微分等。
stackexchange 提醒我,是的,偏好是可以回答的问题;话虽如此,我并不是在寻找 a/the 答案。我是 Python 中的 OOP 新手,所以我只想覆盖这片土地,人们最喜欢解决此类问题的方法,指向我不知道此类东西的包的指针等。(哦......我 知道 pandas; 但我不喜欢它,它对我来说抽象了太多的内部结构,或者更确切地说......让我很难在紧要关头找到它们。)
【问题讨论】:
-
承认你的问题是题外话并不会减少题外话。
-
指出我必须问它的地方。 :)
-
说真的,stackexchange 并没有告诉我我的问题是“题外话”,我只是指这个黄色框:ibb.co/b6gcYJ 但我相信这种恐惧是有道理的。
-
如果这个问题是题外话,那么你可以在这里问的唯一问题是“请为我调试我的代码”?还剩下什么? IMO 这是一个比大多数问题更有趣的问题。
-
@Cris Luengo - 这篇文章会提出一系列很好的主题特定问题,它只是碰巧很大。此外,它的某些部分是主观的,我认为这有可能被标记为 SO。
标签: python matlab class oop large-data