python: перемещение по 4-мерному массиву numpy - PullRequest
1 голос
/ 07 мая 2020

Я работаю с входом 4-мерного массива в сеть CNN. Входной массив имеет следующую форму:

print('X_train shape: ', X_train.shape)
X_train shape:  (47204, 1, 100, 4)

Описание данных:

Входные данные состоят из 47204 экземпляров (сегменты фиксированной длины в соответствии с требованиями CNN ). Каждый экземпляр (1, 100, 4) т.е. сегмент 1 содержит 100-GPS points, и для каждой точки сохраняется 4- соответствующая кинематика точки (max_speed, avg_speed, max_acc, avg_acc), таким образом, (1, 100, 4). Ярлыки хранятся в отдельном массиве y_train формы (47204,) для 5 классов [0..4].

print(y_train)
[3 3 0 ... 2 3 4]

Чтобы лучше понять мой массив X_train, я показываю первые 3 элемента ниже:

print(X_train[1:3])
[
 [[[ 3.82280987e+00 2.16802350e-01  7.49917451e-02  3.44416369e-04]
   [ 3.38707371e+00 2.02210055e-01  1.61751110e-03  1.93745950e-03]
   [ 2.49202215e+00 1.60605262e-01  8.43561351e-03  2.40057917e-03]
   ...
   [ 2.00022316e+00 2.70020923e-01  5.40441673e-02  3.57212151e-03]
   [ 3.25199744e-01 9.06990382e-02  1.46808316e-02  1.65841315e-03]
   [2.96587589e-01  0.00000000e+00  6.13293351e-04 4.16518187e-03]]]

 [[[ 1.07209176e+00 7.27038312e-02 6.62777026e-03  2.04611951e-04]
   [ 1.06194285e+00 5.05005456e-02 4.05676569e-03  3.72293433e-04]
   [ 1.02849748e+00 2.12558178e-02 2.95477005e-03  5.56584054e-04]
   ...
   [ 4.51962909e-03 5.63125736e-04 5.98474074e-04  1.63036715e-05]
   [ 2.83026181e-03 2.35855075e-03  1.25789358e-03 2.15331510e-06]
   [8.49078543e-03  2.16840434e-19 9.43423077e-04 1.29198906e-05]]]

 [[[ 7.51127665e+00 3.14033478e-01  6.85170617e-02  7.73415075e-04]
   [ 7.42307262e+00 1.33868251e-01  4.10564823e-02  1.16131460e-03]
   [ 7.35818066e+00  1.23886976e-02  3.02312582e-02  1.28312101e-03]
   ...
   [ 7.40826167e+00 1.19388656e-01 4.00874715e-02  2.04909489e-04]
   [ 7.23779176e+00 1.33269965e-01  1.20430502e-02  1.58195900e-04]
   [ 7.11697001e+00 4.68002105e-02  5.42478400e-02  3.58101318e-05]]]
]

Задача:

Мне необходимо создать модель машинного обучения (например, случайный лес), используя 4 кинематики (max_speed, avg_speed, max_acc, avg_acc) в качестве функций. Это требует навигации по каждому экземпляру и получения этих функций для 100 точек в экземпляре.

Очевидно, что количество выборок будет 4720400 (т.е. 47204 x 100), поэтому каждое значение также будет соответствовать соответствующая метка его экземпляров, то есть y_train тогда будет (4720400,).

Ожидаемый ввод будет таким:

      max_speed     avg_speed         max_acc       avg_acc   class
0 3.82280987e+00 2.16802350e-01  7.49917451e-02  3.44416369e-04 3
1 3.38707371e+00 2.02210055e-01  1.61751110e-03  1.93745950e-03 3
2 2.49202215e+00 1.60605262e-01  8.43561351e-03  2.40057917e-03 3
...

Я думал о том, как это сделать через неделю все идеи испарились. Как мне это сделать?

1 Ответ

2 голосов
/ 07 мая 2020

Вы можете изменить форму массива X_train с (47204, 1, 100, 4) на (4720400, 4) просто с помощью:

X_train_reshaped = X_train.reshape(4720400, 4)

Он сохраняет порядок данных, и общее количество элементов будет таким же.

Точно так же вы можете расширить массив y_train с помощью команды repeat:

Y_train_reshaped = numpy.repeat(Y_train, 100)

Обратите внимание на команду 100 для repeat. Поскольку у вас была одна метка для 100 точек данных, мы расширим эти элементы в 100 раз. Эта команда также сохранит порядок данных, поэтому все экземпляры будут иметь одинаковую исходную метку.

...