猿问

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

我使用 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-1 维数组(其中 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]]

等等


到目前为止,我一直使用 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])

等等


问题出现在具有更多维度的集合中 - 那么它们无法手动创建。我想在这样的循环中做到这一点:


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-1 维集合?


慕哥9229398
浏览 188回答 2
2回答

慕容708150

您可以使用布尔索引: mask=~np.eye(dim,dtype=bool)现在 D[:,mask[i]] 是你的第 i 个收藏。

UYOU

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):&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;alist.append(D[:, tup])&nbsp; &nbsp; &nbsp;...:&nbsp; &nbsp; &nbsp;In [187]: alistOut[187]:&nbsp;[array([[ 0,&nbsp; 1,&nbsp; 2],&nbsp; &nbsp; &nbsp; &nbsp; [ 4,&nbsp; 5,&nbsp; 6],&nbsp; &nbsp; &nbsp; &nbsp; [ 8,&nbsp; 9, 10]]),&nbsp;&nbsp;array([[ 0,&nbsp; 1,&nbsp; 3],&nbsp; &nbsp; &nbsp; &nbsp; [ 4,&nbsp; 5,&nbsp; 7],&nbsp; &nbsp; &nbsp; &nbsp; [ 8,&nbsp; 9, 11]]),&nbsp;&nbsp;array([[ 0,&nbsp; 2,&nbsp; 3],&nbsp; &nbsp; &nbsp; &nbsp; [ 4,&nbsp; 6,&nbsp; 7],&nbsp; &nbsp; &nbsp; &nbsp; [ 8, 10, 11]]),&nbsp;&nbsp;array([[ 1,&nbsp; 2,&nbsp; 3],&nbsp; &nbsp; &nbsp; &nbsp; [ 5,&nbsp; 6,&nbsp; 7],&nbsp; &nbsp; &nbsp; &nbsp; [ 9, 10, 11]])]我不太确定你想用hstack. 将这些子数组组合成一个宽的可能不是您想要的:In [188]: np.hstack(alist)Out[188]:&nbsp;array([[ 0,&nbsp; 1,&nbsp; 2,&nbsp; 0,&nbsp; 1,&nbsp; 3,&nbsp; 0,&nbsp; 2,&nbsp; 3,&nbsp; 1,&nbsp; 2,&nbsp; 3],&nbsp; &nbsp; &nbsp; &nbsp;[ 4,&nbsp; 5,&nbsp; 6,&nbsp; 4,&nbsp; 5,&nbsp; 7,&nbsp; 4,&nbsp; 6,&nbsp; 7,&nbsp; 5,&nbsp; 6,&nbsp; 7],&nbsp; &nbsp; &nbsp; &nbsp;[ 8,&nbsp; 9, 10,&nbsp; 8,&nbsp; 9, 11,&nbsp; 8, 10, 11,&nbsp; 9, 10, 11]])
随时随地看视频慕课网APP

相关分类

Python
我要回答