как легко создать n-1-мерные коллекции из n-мерного множества? - PullRequest
0 голосов
/ 13 ноября 2018

Я использую данные в формате массива, например:

[[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.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-1-мерные коллекции из n-мерного набора?

Ответы [ 2 ]

0 голосов
/ 14 ноября 2018

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]])
0 голосов
/ 14 ноября 2018

Вы можете использовать логическое индексирование :

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

сейчас D[:,mask[i]] - это ваша i-я коллекция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...