動態的,任意的子集,我找了一個通用的方式來做到這一點:的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