如何从n维集合轻松创建n维集合?

时间:2018-11-13 20:54:23

标签: python numpy

我使用numpy数组格式的数据,例如:

[[5.1 3.5 1.4 0.2]
[4.9 3. 1.4 0.2]
[4.7 3.2 1.3 0.2]
[4.6 3.1 1.5 0.2]
......
[5.9 3. 5.1 1.8]]

我需要n个n维数组(其中n是维数),在这种情况下,需要四个3维数据集。

第一个收藏集:

[[3.5 1.4 0.2]
[3. 1.4 0.2]
[3.2 1.3 0.2]
[3.1 1.5 0.2]
......
[3. 5.1 1.8]]

第二集合:

[[5.1 1.4 0.2]
[4.9 1.4 0.2]
[4.7 1.3 0.2]
[4.6 1.5 0.2]
......
[5.9 5.1 1.8]]

e.t.c。

直到现在,我都使用了numpy.hstack()函数,该函数需要元组形式的参数。我是这样的:

a = []
for i in range (0.3):
   a.append (tuple (map (tuple, D [:, i: i + 1])))

第一个收藏集:

numpy.hstack ([a[1], a[2], a[3])

第二组:

numpy.hstack ([a[0], a[2], a[3])

e.t.c。

问题出现在具有更大尺寸的集合中,因此无法手动创建它们。 我想像这样循环执行:

dim = 4
flag = True
for k in range (0, dim-1):
b = []
for l in range (0, dim-1):
   if l! = k:
      if flag:
         b = a[l]
         flag = False
      else:
         b = numpy.hstack ([b, a[l]])

不幸的是,hstack()函数要求使用尺寸相同的文件,因此我无法将2d集与1d等结合使用。 有谁知道如何从n维集合轻松地创建n维集合?

2 个答案:

答案 0 :(得分:0)

您可以使用boolean indexing

 mask=~np.eye(dim,dtype=bool)

现在D[:,mask[i]]是您的第i个收藏。

答案 1 :(得分:0)

itertools.combinations是生成列索引组合的便捷方法:

In [182]: itertools.combinations(range(4),3)
Out[182]: <itertools.combinations at 0x7f7dc41cb5e8>
In [183]: list(_)
Out[183]: [(0, 1, 2), (0, 1, 3), (0, 2, 3), (1, 2, 3)]

使用它来生成D的子数组:

In [184]: D = np.arange(12).reshape(3,4)
In [185]: alist = []
In [186]: for tup in itertools.combinations(range(4),3):
     ...:     alist.append(D[:, tup])
     ...:     
In [187]: alist
Out[187]: 
[array([[ 0,  1,  2],
        [ 4,  5,  6],
        [ 8,  9, 10]]), 
 array([[ 0,  1,  3],
        [ 4,  5,  7],
        [ 8,  9, 11]]), 
 array([[ 0,  2,  3],
        [ 4,  6,  7],
        [ 8, 10, 11]]), 
 array([[ 1,  2,  3],
        [ 5,  6,  7],
        [ 9, 10, 11]])]

我不太确定您要使用hstack做些什么。将这些子数组组合成一个宽数组可能不是您想要的:

In [188]: np.hstack(alist)
Out[188]: 
array([[ 0,  1,  2,  0,  1,  3,  0,  2,  3,  1,  2,  3],
       [ 4,  5,  6,  4,  5,  7,  4,  6,  7,  5,  6,  7],
       [ 8,  9, 10,  8,  9, 11,  8, 10, 11,  9, 10, 11]])