Заполнение последовательности с numpy и объединение массива объектов с номером массива последовательности - PullRequest
1 голос
/ 13 января 2020

У меня есть ряд последовательностей, сохраненных в 2D-массиве [[first_seq,first_seq],[first_seq,first_seq],[sec_seq,sec_seq]],...

Каждая последовательность векторов отличается по длине. Некоторые имеют длину 55 строк, другие - 68 строк.

2D-массив последовательности (features) имеет форму (427,227) (, особенности ) и у меня есть еще один 1D-массив (num_seq) (5,), который содержит длину каждой последовательности [55,68,200,42,62] (например, первая последовательность равна 55 строкам, вторая последовательность равна 68 строкам и c.). len(1D-array) = number of seq

Теперь мне нужно, чтобы каждая последовательность была одинаково длинной, а именно каждая последовательность должна быть 200. Поскольку в этом примере у меня 5 последовательностей, результирующий массив должен быть structured_seq = np.zeros(5,200,227)

Если последовательность короче, чем 200, все остальные значения этой последовательности должны быть равны нулю.

Поэтому я попытался заполнить structured_seq, выполнив что-то вроде:

for counter, sent in enumerate(num_seq):
    for j, feat in enumerate(features):
        if num_sent[counter] < 200:
            structured_seq[counter,feat,]

, но я застрял ..

Если быть точным: первая последовательность - это первые 55 строк двумерного массива (features), все повторяющиеся 145 должны быть заполнены нулями. И так далее ..

1 Ответ

1 голос
/ 13 января 2020

Это один из способов сделать это с помощью np.insert:

import numpy as np

# Sizes of sequences
sizes = np.array([5, 2, 4, 6])
# Number of sequences
n = len(sizes)
# Number of elements in the second dimension
m = 3
# Sequence data
data = np.arange(sizes.sum() * m).reshape(-1, m)
# Size to which the sequences need to be padded
min_size = 6
# Number of zeros to add per sequence
num_pads = min_size - sizes
# Zeros
pad = np.zeros((num_pads.sum(), m), data.dtype)
# Position of the new zeros
pad_pos = np.repeat(np.cumsum(sizes), num_pads)
# Insert zeros
out = np.insert(data, pad_pos, pad, axis=0)
# Reshape
out = out.reshape(n, min_size, m)
print(out)

Выход:

[[[ 0  1  2]
  [ 3  4  5]
  [ 6  7  8]
  [ 9 10 11]
  [12 13 14]
  [ 0  0  0]]

 [[15 16 17]
  [18 19 20]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]
  [ 0  0  0]]

 [[21 22 23]
  [24 25 26]
  [27 28 29]
  [30 31 32]
  [ 0  0  0]
  [ 0  0  0]]

 [[33 34 35]
  [36 37 38]
  [39 40 41]
  [42 43 44]
  [45 46 47]
  [48 49 50]]]
...