Как выполнить повторное заполнение в numpy? - PullRequest
3 голосов
/ 01 апреля 2020

У меня есть данные переменной длины, и я хочу упаковать их в партии размером до максимума образца в партии, повторяя более короткие выборки.

Например, из этого

[[0, 1, 2, 3, 4], [0, 1, 2], [2, 2, 3]]

сделать это

[[0, 1, 2, 3, 4], [0, 1, 2, 0, 1], [2, 2, 3, 2, 2]]

Ответы [ 3 ]

4 голосов
/ 01 апреля 2020

не numpy ответ, но вы можете сделать это, используя itertools:

from itertools import cycle, islice

lst = [[0, 1, 2, 3, 4], [0, 1, 2], [2, 2, 3]]

n = max(len(item) for item in lst)
res = list(list(islice(cycle(item), n)) for item in lst)
print(res)  # [[0, 1, 2, 3, 4], [0, 1, 2, 0, 1], [2, 2, 3, 2, 2]]

, где я использую cycle для циклического перемещения по спискам и islice для получения первых n элементов.

2 голосов
/ 01 апреля 2020

IIU C, вы можете сделать следующее:

import numpy as np

data = [[0, 1, 2, 3, 4], [0, 1, 2], [2, 2, 3]]
max_len = max(map(len, data))
result = np.array([[row[i % len(row)] for i in range(max_len)] for row in data])

print(result)

Выход

[[0 1 2 3 4]
 [0 1 2 0 1]
 [2 2 3 2 2]]
1 голос
/ 01 апреля 2020

вы можете использовать np.resize :

from itertools import starmap

data = [[0, 1, 2, 3, 4], [0, 1, 2], [2, 2, 3]]
m = len(max(data, key=len))
r = np.array(list(starmap(np.resize, ((e, m) for e in data))))
print(r)

выход:

[[0 1 2 3 4]
 [0 1 2 0 1]
 [2 2 3 2 2]]

вот простой тест с предлагаемыми решениями:

enter image description here

import numpy as np
from itertools import cycle, islice
from random import randint, sample
from itertools import starmap


from simple_benchmark import BenchmarkBuilder
b = BenchmarkBuilder()

@b.add_function()
def hiroprotagonist(lst):
    n = max(len(item) for item in lst)
    res = list(list(islice(cycle(item), n)) for item in lst)
    np.array(res)

@b.add_function()
def kederrac(data):

    m = len(max(data, key=len))
    r = np.array(list(starmap(np.resize, ((e, m) for e in data))))

@b.add_function()
def DaniMesejo(data):

    max_len = max(map(len, data))
    result = np.array([[row[i % len(row)] for i in range(max_len)] for row in data])


@b.add_arguments('Number of sublists')
def argument_provider():
    for exp in range(2, 14):
        size = 2**exp
        yield size, [sample(range(size),  randint(1, min(1000, size))) for _ in range(size)]

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