Чередование строк матрицы с пустыми частями, генерация схемы перестановок - PullRequest
0 голосов
/ 19 октября 2018

У меня есть матрица, которую я хочу перемешать по строкам в соответствии со следующей схемой, описанной ниже:

У нас есть наша матрица a:

import numpy as np
np.random.seed(0)
low = -5
high = 5

num_frames = 2
other_value = 3
dim1 = num_frames * other_value
dim2 = 5
a_shape = (dim1, dim2)
a = np.random.random_integers(low, high, size=a_shape)
print(a)

[[ 0 -5 -2 -2  2]
 [ 4 -2  0 -3 -1]
 [ 2  1  3  3  5]
 [-4  1  2  2  3]
 [-4  0  4  3  4]
 [-1 -2 -5 -2  0]]

И мы хотимразбить наши строки на num_frames групп.Таким образом, для нашей матрицы a с двумя кадрами наше разбиение будет выглядеть следующим образом:

[[ 0 -5 -2 -2  2]
 [ 4 -2  0 -3 -1]
 [ 2  1  3  3  5]

 [-4  1  2  2  3]
 [-4  0  4  3  4]
 [-1 -2 -5 -2  0]]

Затем мы хотим чередовать строки каждого кадра, чтобы перестановка была задана как [0, 3, 1, 4, 2, 5],где эти числа являются индексами строк.

Для a это даст нам матрицу, которая выглядит следующим образом:

[[ 0 -5 -2 -2  2]
[-4  1  2  2  3]
[ 4 -2  0 -3 -1]
[-4  0  4  3  4]
[ 2  1  3  3  5]
[-1 -2 -5 -2  0]]

Если бы у нас было 3 кадра, но такое же количество строк(то есть other_value=2), наша перестановка будет [0, 2, 4, 1, 3, 5], что дает матрицу:

 [[ 0 -5 -2 -2  2]
 [ 2  1  3  3  5]
 [-4  0  4  3  4]
 [ 4 -2  0 -3 -1]     
 [-4  1  2  2  3]
 [-1 -2 -5 -2  0]]

Я не могу понять, что такое:

Какими способами это можно сделать?генерировать правильную перестановку для матриц произвольного размера и количество кадров?Предполагается, что у нас всегда будет одинаковое количество строк в каждом кадре (или, dim1 % num_frames = 0).

Способ перестановки строк был бы приведенным ниже кодом, но я не уверен, какполучить перестановку.

b = a.copy()
perm = [0, 3, 1, 4, 2, 5]
b[[0, 1, 2, 3, 4, 5]] = a[perm]
print(b)

Ответы [ 3 ]

0 голосов
/ 19 октября 2018

Эта логика цикла должна давать желаемые перестановки:

a = [0, 1, 2, 3, 4, 5]

num_frames = 2
other_value = 3

new_list = []
for i in range(other_value):
    for j in range(i, len(a), other_value):
        new_list.append(j)

print new_list
0 голосов
/ 19 октября 2018

Чтобы получить перестановку, вы можете сделать:

def perm(nb_rows, nb_frames):
    return [frame*nb_rows//nb_frames + row for row in range(nb_rows // nb_frames)      
                                           for frame in range(nb_frames)]

print(perm(6, 2))
# [0, 3, 1, 4, 2, 5]

print(perm(6, 3))
# [0, 2, 4, 1, 3, 5]

print(perm(20, 4))
# [0, 5, 10, 15, 1, 6, 11, 16, 2, 7, 12, 17, 3, 8, 13, 18, 4, 9, 14, 19]
0 голосов
/ 19 октября 2018

Вот одна функция, которая делает то, что вы хотите, используя np.reshape и np.transpose:

def interleave_frames(a, num_frames):
    if len(a) % num_frames != 0: raise ValueError
    frame_size = len(a) // num_frames
    out = np.reshape(a, (num_frames, frame_size, -1))
    out = np.transpose(out, (1, 0, 2))
    return np.reshape(out, (len(a), -1))

Тест:

import numpy as np

np.random.seed(0)
low = -5
high = 5
num_frames = 2
other_value = 3
dim1 = num_frames * other_value
dim2 = 5
a_shape = (dim1, dim2)
a = np.random.random_integers(low, high, size=a_shape)
print('Array:')
print(a)
print('Interleaved:')
print(interleave_frames(a, num_frames))

Выход:

Array:
[[ 0 -5 -2 -2  2]
 [ 4 -2  0 -3 -1]
 [ 2  1  3  3  5]
 [-4  1  2  2  3]
 [-4  0  4  3  4]
 [-1 -2 -5 -2  0]]
Interleaved:
[[ 0 -5 -2 -2  2]
 [-4  1  2  2  3]
 [ 4 -2  0 -3 -1]
 [-4  0  4  3  4]
 [ 2  1  3  3  5]
 [-1 -2 -5 -2  0]]

РЕДАКТИРОВАТЬ:

Если вы действительно хотите получить индексы в любом случае, применяется тот же подход (изменить / преобразовать / изменить):

print(np.arange(len(a)).reshape((num_frames, -1)).transpose().reshape(-1))
# [0 3 1 4 2 5]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...