动态的,任意的子集,我找了一个通用的方式来做到这一点:的Python和NumPy的 - 创造ndarray
raw_data = np.array(somedata)
filterColumn1 = raw_data[:,1]
filterColumn2 = raw_data[:,3]
cartesian_product = itertools.product(np.unique(filterColumn1), np.unique(filterColumn2))
for val1, val2 in cartesian_product:
fixed_mask = (filterColumn1 == val1) & (filterColumn2 == val2)
subset = raw_data[fixed_mask]
我希望能够使用filterColumns的任何量。所以我想要的是:
filterColumns = [filterColumn1, filterColumn2, ...]
uniqueValues = map(np.unique, filterColumns)
cartesian_product = itertools.product(*uniqueValues)
for combination in cartesian_product:
variable_mask = ????
subset = raw_data[variable_mask]
是否有一个简单的语法来做我想要的?否则,我应该尝试一种不同的方法吗?
编辑:这似乎是工作
cartesian_product = itertools.product(*uniqueValues)
for combination in cartesian_product:
variable_mask = True
for idx, fc in enumerate(filterColumns):
variable_mask &= (fc == combination[idx])
subset = raw_data[variable_mask]
我很想接受你的答案,但不是每个人都可以在他们的脑海中旋转n维矩阵。 ;)换句话说,我不确定如何为我的问题实现此解决方案。我深入研究了argsort和rollaxis文档,但如何将它们应用于获取子集已经超出了我的想象。幸运的是,我的数据不是太大,所以循环很好,尽管我完全同意你的说法,尽可能避免循环。 – 2014-10-03 20:35:25
请更新。实际上,这是我想到的lexsort,而不是argsot,它们都提供了排序索引数组,仅在一个轴的几个单个元素上与一个轴的几个元素相关:D – chiffa 2014-10-03 22:00:24
非常感谢您的详细更新!我现在遵循你的逻辑,并学习了一种更好的方式来思考numpy中的数据操作。你用来获得自相关和断点相当标准的方法吗?看起来,新手很难理解你在没有评论的情况下在代码中做什么。 – 2014-10-05 16:06:56