Разбить массив на несколько массивов по заданным границам, python - PullRequest
0 голосов
/ 09 марта 2020

У меня есть массив numpy, который состоит из 64 столбцов и 49 строк. Каждая строка обозначает отдельное сообщение и содержит несколько частей информации. Когда информация начинается или заканчивается, можно узнать по изменению значения. В следующем фрагменте массива numpy:

[[1 1 0 0 2 2 2 2 1 0 0 0 0 2 ... 2 2 2]
 [0 0 0 2 2 2 2 2 2 2 2 2 2 2 ... 2 2 2]
 [2 0 0 1 2 0 0 0 0 0 0 0 0 0 ... 1 1 0]
 .
 .
 .
 [0 1 0 1 0 1 0 1 0 0 0 0 0 0 ... 2 2 2]]

Первая информация первого сигнала, следовательно, занимает первые две позиции [11]. Изменяя значение с 1 на 0, я знаю, что вторая информация находится в третьей и четвертой позиции [00]. Третья информация занимает следующие четыре позиции [2222]. Следующая информация состоит только из [1]. И так далее ...

После того, как я определил позиции каждой информации о сигнале, я должен применить эти границы к моим массивам сигналов numpy. Мой первый двоичный сигнал numpy массив состоит из 64 столбцов и 3031 строки:

[[1 1 0 0 0 0 0 1 0 1 0 1 0 0 ... 1 0 0 1]
 [1 0 1 0 1 1 1 1 1 0 0 1 1 0 ... 1 1 1 0]
 [0 1 0 1 1 1 0 0 1 0 0 1 1 1 ... 1 1 1 0]
 .
 .
 .
 [1 0 1 0 0 1 0 0 0 0 1 1 0 1 ... 1 1 1 0]]

Мой первый массив (первая информация из первого сигнала) состоит из первых двух позиций, как определено предыдущим массивом. Вывод должен выглядеть следующим образом:

[[11]
 [10]
 [01]
 .
 .
 .
 [10]]

Вывод второго массива (третья и четвертая позиции) должен быть следующим:

[[00]
 [10]
 [01]
 .
 .
 .
 [10]]

Вывод третьего массива:

[[0001]
 [1111]
 [1100]
 .
 .
 .
 [0100]]

К сожалению, я не знаю, как создать и применить начальные границы первого массива к двоичным массивам. У кого-нибудь есть решение для этого?

Спасибо за помощь!

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Извините, я поместил подсказку, где вы должны создать al oop в неправильном месте. Посмотрите, работает ли этот код: (Я попытался объяснить numpy нарезку в комментариях, но могу узнать больше здесь: Numpy индексирование и нарезка

import itertools
import numpy as np

# Def to reshape signals according to message
def reshape(lst1, lst2):
    iterator = iter(lst2)
    return [[next(iterator) for _ in sublist]
                         for sublist in lst1]

# Arrays
array_1 = np.array([[1,1,0,0,2,2,2,2,1,0,0,0,0,2],
                    [0,0,0,2,2,2,2,2,2,2,2,2,2,2],
                    [2,0,0,1,2,0,0,0,0,0,0,0,0,0],
                    [0,1,0,1,0,1,0,1,0,0,0,0,0,0]])

array_2 = np.array([[1,1,0,0,0,0,0,1,0,1,0,1,0,0],
                    [1,0,1,0,1,1,1,1,1,0,0,1,1,0],
                    [0,1,0,1,1,1,0,0,1,0,0,1,1,1],
                    [1,0,1,0,0,1,0,0,0,0,1,1,0,1]])

#Group messages into pieces of information
signal_list = []
for lists in array_1:
    signal_list.append([list(group) for key, group in itertools.groupby(lists)])

#Index for all message
All_messages={}

#Do this for each message:
for rows in range(len(array_1)):
    #Reshapes each signal according to current message 
    signals_reshape = (np.array([reshape(signal_list[rows], array_2[i]) for i in range(len(array_2))]))

    # Create list to append all signals in current message
    all_signal = []
    # Do this for each information block
    for i in range(len(signals_reshape[rows])):
        '''
        Append information blocks 
        1st [:] = retrieve in all signals
        2nd [:] = retrieve the whole signal
        3rd [:,i] = retrieve information block from specific column
        Example: signals_reshape[0][0][0] retrieves the first information element of first information block of the fisrt signal
                 signals_reshape[0][0][:] retrieves all the information elements from the first information block from the first signal
                 signals_reshape[:][:][:,0] retrieves the first information block from all the signals
        '''
        all_signal.append(signals_reshape[:][:][:,i].flatten())     
    # add message information to dictionary (+ 1 is so that the names starts at Message1 and not Message0
    All_messages["Message{0}".format(rows+1)] = all_signal

print(All_messages['Message1'])
print(All_messages['Message2'])
print(All_messages['Message3'])
print(All_messages['Message4'])
0 голосов
/ 12 марта 2020

Кредиты @ Kemp ie. Он решил проблему. Я просто адаптировал его код под свои нужды, немного его укоротил и исправил несколько небольших ошибок.

 import itertools
 import numpy as np

# Def to reshape signals according to message
def reshape(lst1, lst2):
    iterator = iter(lst2)
    return [[next(iterator) for _ in sublist]
                         for sublist in lst1]

# Arrays
array_1 = np.array([[1,1,0,0,2,2,2,2,1,0,0,0,0,2],
                    [0,0,0,2,2,2,2,2,2,2,2,2,2,2],
                    [2,0,0,1,2,0,0,0,0,0,0,0,0,0],
                    [0,1,0,1,0,1,0,1,0,0,0,0,0,0]])

#in my case, array_2 was a list (see difference of code to Kempies solutions)
array_2 = np.array([[1,1,0,0,0,0,0,1,0,1,0,1,0,0],
                    [1,0,1,0,1,1,1,1,1,0,0,1,1,0],
                    [0,1,0,1,1,1,0,0,1,0,0,1,1,1],
                    [1,0,1,0,0,1,0,0,0,0,1,1,0,1]])

#Group messages into pieces of information
signal_list = []
for lists in array_1:
    signal_list.append([list(group) for key, group in itertools.groupby(lists)])

signals_reshape_list = []
#Do this for each message (as array_2 is a list, we must work with indices):
for rows in range(len(array_1)):
    #Reshapes each signal according to current message 
    signals_reshape = (np.array([reshape(signal_list[rows], array_2[rows][i]) for i in range(len(array_2[rows]))]))
    signals_reshape_list.append(signals_reshape)

#print first signal of third message e.g.
print(signals_reshape_list[2][:,0]
0 голосов
/ 09 марта 2020

Посмотрите, может ли это вам помочь. В этом примере возвращается информация для 1-го сообщения, но вы должны иметь возможность создать al oop для всех 49 сообщений и назначить его в новый список.

import itertools
import numpy as np

# Def to reshape signals according to message
def reshape(lst1, lst2):
    iterator = iter(lst2)
    return [[next(iterator) for _ in sublist]
                         for sublist in lst1]

# Arrays
array_1 = np.array([[1,1,0,0,2,2,2,2,1,0,0,0,0,2],
                    [0,0,0,2,2,2,2,2,2,2,2,2,2,2],
                    [2,0,0,1,2,0,0,0,0,0,0,0,0,0]])

array_2 = np.array([[1,1,0,0,0,0,0,1,0,1,0,1,0,0],
                    [1,0,1,0,1,1,1,1,1,0,0,1,1,0],
                    [0,1,0,1,1,1,0,0,1,0,0,1,1,1]])

#Group messages into pieces of information
signal_list = []
for lists in array_1:
    signal_list.append([list(group) for key, group in itertools.groupby(lists)])

# reshapes signals for each message to be used
signals_reshape = np.array([reshape(signal_list[0], array_2[i]) for i in range(len(array_2))])
print(signals_reshape[0])

# Get information from first message (Can create a loop to do the same for all 49 messages)
final_list_1 = []
for i in range(len(signals_reshape[0])):
    final_list_1.append(signals_reshape[:][:][:,i].flatten())

print(final_list_1[0])
print(final_list_1[1])
print(final_list_1[2])

Вывод:

final_list_1 [0]

[список ([1, 1]), список ([1, 0]), список ([0, 1])]

final_list_1 [1]

[список ([0, 0]), список ([1, 0]), список ([0, 1])]

final_list_1 [2]

[список ([0, 0, 0, 1]) список ([1, 1, 1, 1]) список ([1, 1, 0, 0])]

...