Я пытаюсь эффективно преобразовать довольно большой массив закодированных данных. Исходный массив (orig_array) кодируется с использованием кодировки термометра (enc_array)
import numpy as np
from numpy.lib.stride_tricks import sliding_window_view
n_features = 4
time_window = 3
n_bins = 3
orig_array = np.array([1,0,2,1,2,1,0,3,1,3,0,1,2,0,3,1,0,1,2,1])
def encode(arr, n_bins):
res = np.stack([np.pad(np.ones(t), (0,n_bins - t), 'constant') for t in arr])
return res.flatten()
# apply thermometer encoding & reshape
enc_array = encode(orig_array, n_bins)
reshp_array = np.reshape(enc_array, (5,12))
У меня есть 2 вопроса: во-первых, когда данные кодируются (кодирование термометра), я хотел бы применитьскользящий_window_view (или какой-то другой аккуратный способ), чтобы результирующий массив стал следующим: (каждые 3 разделенных целых числа визуально соответствуют одному закодированному признаку)
1-я строка этого массива соответствует таким данным, что
[encoded_feature1@t=0, encoded_feature2@t=0, encoded_feature3@t=0, encoded_feature4@t=0,
encoded_feature1@t=1, encoded_feature2@t=1, encoded_feature3@t=1, encoded_feature4@t=1,
encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2]
2-я строка этого массива соответствует таким данным, что
[encoded_feature1@t=1, encoded_feature2@t=1, encoded_feature3@t=1, encoded_feature4@t=1,
encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2,
encoded_feature1@t=3, encoded_feature2@t=3, encoded_feature3@t=3, encoded_feature4@t=3]
и 3-я строка этого массива соответствует таким данным, что
[encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2,
encoded_feature1@t=3, encoded_feature2@t=3, encoded_feature3@t=3, encoded_feature4@t=3,
encoded_feature1@t=4, encoded_feature2@t=4, encoded_feature3@t=4, encoded_feature4@t=4]
Во-вторых, я хотел бы получить следующую форму и порядок элементов (форма – 3x9x4):
Очевидно, что один из способов — использовать цикл, но я ищу более эффективный способ. Я думаю, что это можно сделать, применив комбинациюскользящего_окна_вида и ступенчатой нарезки. Но я застрял на этом какое-то время и просто не могу понять. Буду признателен за любые предложения.
Я пытаюсь эффективно преобразовать довольно большой массив закодированных данных. Исходный массив (orig_array) кодируется с использованием кодировки термометра (enc_array) [code]import numpy as np from numpy.lib.stride_tricks import sliding_window_view
def encode(arr, n_bins): res = np.stack([np.pad(np.ones(t), (0,n_bins - t), 'constant') for t in arr]) return res.flatten()
# apply thermometer encoding & reshape enc_array = encode(orig_array, n_bins) reshp_array = np.reshape(enc_array, (5,12)) [/code] У меня есть 2 вопроса: во-первых, когда данные кодируются (кодирование термометра), я хотел бы применитьскользящий_window_view (или какой-то другой аккуратный способ), чтобы результирующий массив стал следующим: (каждые 3 разделенных целых числа визуально соответствуют одному закодированному признаку) [code]dyn_enc_array = np.array([ [1,0,0, 0,0,0, 1,1,0, 1,0,0, 1,1,0, 1,0,0, 0,0,0, 1,1,1, 1,0,0, 1,1,1, 0,0,0, 1,0,0], [1,1,0, 1,0,0, 0,0,0, 1,1,1, 1,0,0, 1,1,1, 0,0,0, 1,0,0, 1,1,0, 0,0,0, 1,1,1, 1,0,0], [1,0,0, 1,1,1, 0,0,0, 1,0,0, 1,1,0, 0,0,0, 1,1,1, 1,0,0, 0,0,0, 1,0,0, 1,1,0, 1,0,0]]) [/code] 1-я строка этого массива соответствует таким данным, что [encoded_feature1@t=0, encoded_feature2@t=0, encoded_feature3@t=0, encoded_feature4@t=0, encoded_feature1@t=1, encoded_feature2@t=1, encoded_feature3@t=1, encoded_feature4@t=1, encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2] 2-я строка этого массива соответствует таким данным, что [encoded_feature1@t=1, encoded_feature2@t=1, encoded_feature3@t=1, encoded_feature4@t=1, encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2, encoded_feature1@t=3, encoded_feature2@t=3, encoded_feature3@t=3, encoded_feature4@t=3] и 3-я строка этого массива соответствует таким данным, что [encoded_feature1@t=2, encoded_feature2@t=2, encoded_feature3@t=2, encoded_feature4@t=2, encoded_feature1@t=3, encoded_feature2@t=3, encoded_feature3@t=3, encoded_feature4@t=3, encoded_feature1@t=4, encoded_feature2@t=4, encoded_feature3@t=4, encoded_feature4@t=4] Во-вторых, я хотел бы получить следующую форму и порядок элементов (форма – 3x9x4): [code]result = [[[1,0,0, 1,1,0, 1,0,0], [0,0,0, 1,0,0, 1,1,1], [1,1,0, 0,0,0, 0,0,0], [1,0,0, 1,1,1, 1,0,0]],
[[1,0,0, 1,1,0, 1,0,0], [0,0,0, 1,0,0, 1,1,1], [1,1,0, 0,0,0, 0,0,0], [1,0,0, 1,1,1, 1,0,0]]] [/code] Очевидно, что один из способов — использовать цикл, но я ищу более эффективный способ. Я думаю, что это можно сделать, применив комбинациюскользящего_окна_вида и ступенчатой нарезки. Но я застрял на этом какое-то время и просто не могу понять. Буду признателен за любые предложения.