以所有可能的组合拆分数组(不是定期拆分)

时间:2017-08-20 08:44:59

标签: python arrays python-3.x numpy split

请在投票前仔细阅读此问题。我在其他问题中找不到我的问题。

假设我有一个数组,

>>> import numpy as np
>>> array  = np.linspace(1,4,4, dtype=np.int)
>>> array
array([1, 2, 3, 4])

我想要一个将这个数组拆分成所有可能部分的函数,例如,

没有分裂:

([1,2,3,4])

分成2部分:

([1], [2,3,4])
([1,2], [3,4])
([1,2,3] ,[4])

分成3部分:

([1], [2], [3,4])
([1,2]), [3], [4])
([1], [2,3], [4])

分成len(array)部分:

([1],[2],[3],[4])

我知道有np.split(array, r),但它不会给出所有可能的分裂。例如np.split(array, 2)会给出,

[array([0, 1]), array([2, 3])]

正如你所看到的,这不是我需要的。如何实现我的需求?

2 个答案:

答案 0 :(得分:3)

您可以使用itertools.combinations生成索引,在循环内拆分分割数量:

>>> from itertools import combinations
>>> [np.split(array, idx) 
...  for n_splits in range(5) 
...  for idx in combinations(range(1, len(array)), n_splits)]
[[array([1, 2, 3, 4])],
 [array([1]), array([2, 3, 4])],
 [array([1, 2]), array([3, 4])],
 [array([1, 2, 3]), array([4])],
 [array([1]), array([2]), array([3, 4])],
 [array([1]), array([2, 3]), array([4])],
 [array([1, 2]), array([3]), array([4])],
 [array([1]), array([2]), array([3]), array([4])]]

答案 1 :(得分:2)

不熟悉numpy,但你可以在纯粹的python中使用分而治之(无论是否分裂在这个位置):

/((([A-Za-z]{3,9}:(?:\\/\\/)?)(?:[-;:&=+\\$,\\w]+@)?‌​[A-Za-z0-9.-]+|(?:ww‌​w.|[-;:&=+\\$,\\w]+@‌​)[A-Za-z0-9.-]+)((?:‌​\\/[%+~\\/.\\w-_]*)?‌​\\??(?:[-+=&;%@.\\w_‌​]*)#?(?:[\\w]*))?)/