создать 2D-массив из 1D-массива и логический массив в Python - PullRequest
0 голосов
/ 05 января 2019

Здравствуйте, я пытаюсь создать 2d массив из этих массивов

A=[5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]

B=[False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

Я надеюсь получить такую ​​матрицу

C= [[1, -3, 0],
    [2, 7],
    [8],
    [18,9]]

то есть при каждом изменении массива B с False на True создайте новую строку с последовательными значениями True.

пожалуйста, кто-нибудь может мне помочь

Ответы [ 4 ]

0 голосов
/ 05 января 2019
from itertools import groupby, ifilter, izip
from operator import itemgetter

get_0 = itemgetter(0)

A=[5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]
B=[False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

list((list((vv for _, vv in v))
    for _, v in
       ifilter(get_0, groupby(izip(B,A), get_0))))

Результат:

[[1, -3, 0], [2, 7], [8], [18, 9]]
0 голосов
/ 05 января 2019

Вот метод с использованием генератора. Нет никакой реальной причины использовать генератор, а не функцию на самом деле, только то, к чему я впервые обратился.

def splitter(A, B):
    sublist = []
    for item, check in zip(A, B):
        if not check:
            if sublist:
                yield sublist 
                sublist = []
        else:
            sublist.append(item)
    if sublist:
        yield sublist

A = [5, 7, 1, -3, 0, 2, 2, 7, 10, 11, -1, 8, 5, 18, 9]
B = [False, False, True, True, True, False, True, True, False, False, False, True, False, True, True]

list(splitter(A, B))

Выход:

[[1, -3, 0], [2, 7], [8], [18, 9]]
0 голосов
/ 05 января 2019

Этот алгоритм перебирает A, накапливает последовательные значения true A в D до тех пор, пока не будет найдено значение false A, и добавляет D к C, только если он накопил в нем true значений. Наконец, в последнем цикле он добавляет D к C, опять же, если D имеет какие-либо значения.

C = []
D = []
for i in range(len(A)):
    if B[i]:
        D.append(A[i])
    elif len(D):
        C.append(D)
        D = []
    if i == len(A)-1 and len(D):
        C.append(D)
0 голосов
/ 05 января 2019

Обычные целочисленные массивы NumPy не могут иметь зубчатую форму, например для двумерного массива каждая строка должна иметь одинаковое количество столбцов. Но вы можете создать список массивов через np.split:

lst_of_array = np.split(A, np.where(np.diff(B) == 1)[0]+1)[{0:1,1:0}[B[0]]::2]

# [array([ 1, -3,  0]),
#  array([2, 7]),
#  array([8]),
#  array([18,  9])]

Или для списка списков:

from operator import methodcaller

lst_of_lst = list(map(methodcaller('tolist'), lst_of_array))

# [[1, -3, 0],
#  [2, 7],
#  [8],
#  [18, 9]]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...