Как изменить массив NumPy, сохраняя каждый элемент N - PullRequest
0 голосов
/ 14 мая 2018

У меня есть массив значений, скажем, (1000, 80), и я хочу преобразовать его в (100, 40, 2).Вы можете думать об этом как о 1000 наблюдениях, где первые 40 столбцов относятся к определенному объекту через 40 дней, а следующие 40 столбцов - ко второму объекту за те же 40 дней.

Итак, я хочу, чтобы 2-йизмерение должно составлять 40 дней, в то время как 3-е должно быть значениями этих двух функций для каждого дня.

Вот простой пример с тем, что я пробовал:

import numpy as np

data = [[11, 22, 33, 44],
        [55, 66, 77 ,88],
        [99, 100, 101, 102]]
data = np.array(data)

# This works but I have to manually do it for every day
np.c_[data[:, ::2], data[:, 1::2]].reshape((3, 2, 2))

# This does not work
np.c_[data[:, i::2] for i in range(2)].reshape((3, 2, 2))

Желаемый результат:

array([[[ 11,  33],
    [ 22,  44]],
    [[ 55,  77],
     [ 66,  88]],
    [[ 99, 101],
     [100, 102]]])

1 Ответ

0 голосов
/ 14 мая 2018

Вы можете reshape сначала, а затем транспонировать вторую и третью оси:

data.reshape(-1, 2, data.shape[1] / 2).transpose(0,2,1)
#array([[[ 11,  33],
#        [ 22,  44]],

#       [[ 55,  77],
#        [ 66,  88]],

#       [[ 99, 101],
#        [100, 102]]])

Или swapaxes:

data.reshape(-1, 2, data.shape[1] / 2).swapaxes(1,2)
#array([[[ 11,  33],
#        [ 22,  44]],

#       [[ 55,  77],
#        [ 66,  88]],

#       [[ 99, 101],
#        [100, 102]]])

Или, как прокомментировал @wwii, reshapeс column-major заказ:

data.reshape(-1, data.shape[1] / 2, 2, order='F')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...